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:
// 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に書いて、警告することはできません.