GCCコンパイルWARNING解決:「extra tokens at end of#ifndef directive」tags:GCC,WARNING
2004 ワード
最近、プロジェクトのすべてのWARNINGをチェックして、面白いWARNINGを発見しました:“extra tokens at end of#ifndef directive”.字面的には「#ifndefの後ろに無効な命令がある」.私的には小さなプログラムの検証を書いたが、このWARNINGを生み出すには2つの状況があることが分かった.
プログラム1:
以上のプログラムはわざと#endif/**/の後ろに無効な文字xを追加し、GCCバンド-Wallパラメータでコンパイルし、以下のようにします:
私はすぐに呆然として、このような明らかに“ERROR”の問題で、GCCはただ1つのWARNINGで、しかも実行可能なバイナリファイルを生成して、
プログラム2:
以上、余分な「x」を削除すると、コンパイルは完全に正常になります.次のようになります.
さらに発散した下#ifndefの後に現れる可能性がある場合、このアラームを引き起こす可能性があることが分かった.
プログラム3:
命令を執行する」
その原因を究明して、C言語は#ifndefの前処理に対して、ただキーワードだけを検査して、後の“(x,y)”、余分な文字だと思って、括弧を取って
プログラム1:
// directive_1.c
#include
#ifndef MIN
#define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif /**/x
int main()
{
printf("min val = %d
", MIN(100, -1));
return 0;
}
以上のプログラムはわざと#endif/**/の後ろに無効な文字xを追加し、GCCバンド-Wallパラメータでコンパイルし、以下のようにします:
gcc directive_1.c -Wall -o out1
はすぐに警告を発生しました:directive_1.c:5:12: warning: extra tokens at end of #endif directive [-Wendif-labels]
#endif /**/x
私はすぐに呆然として、このような明らかに“ERROR”の問題で、GCCはただ1つのWARNINGで、しかも実行可能なバイナリファイルを生成して、
./out1
を実行して、結果は正常で、効果は以下の通りです:min val = -1
プログラム2:
// directive_2.c
#include
#ifndef MIN
#define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif
int main()
{
printf("min val = %d
", MIN(100, -1));
return 0;
}
以上、余分な「x」を削除すると、コンパイルは完全に正常になります.次のようになります.
wangkai@fiberserver:extra-tokens-at-end-of-#ifndef-directive$ gcc directive_2.c -Wall -o out1
wangkai@fiberserver:extra-tokens-at-end-of-#ifndef-directive$
さらに発散した下#ifndefの後に現れる可能性がある場合、このアラームを引き起こす可能性があることが分かった.
プログラム3:
// directive_3.c
#include
#ifndef MIN(x, y)
#define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif
int main()
{
printf("min val = %d
", MIN(100, -1));
return 0;
}
命令を執行する」
gcc directive_3.c -Wall -o out3
、不思議なことにこの警告が現れた.wangkai@fiberserver:extra-tokens-at-end-of-#ifndef-directive$ gcc directive_3.c -Wall -o out3
directive_3.c:3:12: warning: extra tokens at end of #ifndef directive
#ifndef MIN(x, y)
^
その原因を究明して、C言語は#ifndefの前処理に対して、ただキーワードだけを検査して、後の“(x,y)”、余分な文字だと思って、括弧を取って
#ifndef MIN
に書いて、警告することはできません.