2

古いコードを更新していますが、誤って定義されていないマクロを内部に残してしまいました。

// "DETAIL" is not defined anywhere
if (DETAIL ("notebook")) {
    // ...
}

コードは引き続きコンパイルおよびリンクされますが(.soライブラリ)、ロードされると次のようになります。

gtk3-widget-factory: symbol lookup error: /usr/lib/gtk-3.0/3.0.0/
theming-engines/libmurrine.so: undefined symbol: DETAIL

なぜこれがコンパイル時にキャッチされないのですか?CはDETAIL定義なしで見て、それが関数だと思っていると思いint -> intますよね?コンパイラ(gcc)をより厳密にし、コンパイル時に文句を言う方法はありますか?ソースファイルまたはヘッダーファイルで定義されていないシンボルを直接使用しているとは思いません。

4

1 に答える 1

4

あなたの分析は正しいです:DETAIL暗黙的に定義された関数として扱われます。

gccマニュアルから:

-Wimplicit-function-declaration (C and Objective-C only)

関数が宣言される前に使用されるたびに警告を発します。C99 モード (-std=c99または-std=gnu99) では、この警告はデフォルトで有効になっており、 によってエラーになります-pedantic-errors。この警告は によっても有効になり-Wallます。

さらに、@Jonathan Leffler がコメントで指摘しているように:

また、GCC の一部のバージョンでは、エラーになります-Werror=implicit-function-declaration(他の明示的な警告オプションについても同様です)。すべての警告は、 でエラーに変換できます-Werror

于 2013-03-13T11:30:48.767 に答える