#ifndef在C中被忽略?

时间:2018-11-10 10:08:10

标签: c conditional-compilation

我只有定义DEBUG的地方才需要记录一些代码。因此,尽管我可以用注释字符串“ //”替换令牌(此处为“ DEBUGLOG”)。但是怎么办?

    #ifndef DEBUG
     #define DEBUGLOG //
    #endif

[...] 
    DEBUGLOG        printf("Debug String"\n);
[...]

代码中没有其他地方的DEBUG定义。但是我的gcc编译了这一行,程序本身执行了printf();

为什么?

我试图将其包含在这样的括号中,但是它得到了编译错误:

#ifndef DEBUG
 #define DEBUGLOG "//"
#endif

这是编译器消息:

beispiel.c:45:10: error: expected ‘;’ before ‘printf’
 DEBUGLOG printf("Debug String"\n);
          ^

有任何提示吗?

1 个答案:

答案 0 :(得分:3)

如果您查看Phases of translation,则会发现执行预处理器的阶段(阶段4)是在之后,在该阶段之后,注释被替换为空白字符(阶段) 3)。

  

第3阶段
  1)将源文件分解为注释,空白字符序列(空格,水平制表符,换行符,垂直制表符和换页符)以及预处理标记,这些标记如下:
  ...
  2)每个注释都用一个空格字符代替

     

第四阶段
  1)预处理器已执行。

因此,在第3阶段中,该行为:

#define DEBUGLOG //

成为:

#define DEBUGLOG 

第4阶段的行:

DEBUGLOG        printf("Debug String"\n);

成为:

printf("Debug String"\n);

这就是执行您的printf的原因。

当您使用引号("//")时,该行变为:

"//"   printf("Debug String"\n);

引号("")将不会被删除。这是编译器错误。