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

Tom*_*ner 5 c

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

#if BYTE_ORDER == LITTLE_ENDIAN
   do_something();
#endif
Run Code Online (Sandbox Code Playgroud)

导致'do_something()'被编译,如果既BYTE_ORDER没有LITTLE_ENDIAN定义也没有定义.虽然这不是不合理的行为,但我无法在gcc上找到任何选项在这种情况下给我一个警告.

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

Bif*_*fen 5

来自man gcc:

-Wundef
    Warn if an undefined identifier is evaluated in an #if directive.
Run Code Online (Sandbox Code Playgroud)

从而:

echo -e '#if BYTE_ORDER == LITTLE_ENDIAN\n#endif'|gcc -E - -Wundef
Run Code Online (Sandbox Code Playgroud)

打印:

# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
<stdin>:1:5: warning: "BYTE_ORDER" is not defined [-Wundef]
<stdin>:1:19: warning: "LITTLE_ENDIAN" is not defined [-Wundef]
Run Code Online (Sandbox Code Playgroud)

它会变得更好-Werror=undef.

  • `-Werror'一切都好一点(唔不开头,但它很好:D) (5认同)