是否有任何C编译器会警告使用未声明的定义

我最近遇到了以下构造的情况

#if BYTE_ORDER == LITTLE_ENDIAN do_something(); #endif 

如果既未定义BYTE_ORDER也未定义LITTLE_ENDIAN则会BYTE_ORDER编译’do_something()’。 虽然这不是不合理的行为,但我无法在gcc上找到任何选项在这种情况下给我一个警告。

如果没有警告,您可以进入相当令人担忧的情况,即某人可以删除一个明显未使用的标头,它将完全改变编译结果,因为它导致包含一个定义这两个宏的标头(并以不同的方式定义它们)。

来自man gcc

 -Wundef Warn if an undefined identifier is evaluated in an #if directive. 

从而:

 echo -e '#if BYTE_ORDER == LITTLE_ENDIAN\n#endif'|gcc -E - -Wundef 

打印:

 # 1 "" # 1 "" # 1 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "" 2 # 1 "" :1:5: warning: "BYTE_ORDER" is not defined [-Wundef] :1:19: warning: "LITTLE_ENDIAN" is not defined [-Wundef] 

使用-Werror=undef会变得更好。 😉