-Wundef 不警告#ifdef 前面的未定义符号

-Wundef does not warn about an undefined symbol in front of #ifdef

请考虑以下代码:

// program.cpp

#include <iostream>

int main() {
#ifdef LINUX
    std::cout << "Linux\n";
#elif MAC
    std::cout << "Mac\n";
#elif WINDOWS
    std::cout << "Windows\n";
#elif BSD
    std::cout << "BSD\n";
#else
    std::cout << "Something else\n";
#endif
    return 0;
}

如果我同时用 clang 和 gcc 编译它,

clang++ -Wundef -DBSD -o program program.cpp
# or
g++ -Wundef -DBSD -o program program.cpp

我会收到未定义符号 MACWINDOWS 的警告,但不会收到符号 LINUX:

的警告
program.cpp:6:7: warning: 'MAC' is not defined, evaluates to 0 [-Wundef]
#elif MAC
      ^
program.cpp:8:7: warning: 'WINDOWS' is not defined, evaluates to 0 [-Wundef]
#elif WINDOWS
      ^
2 warnings generated.

根据 gcc 手册页:

-Wundef 
    Warn if an undefined identifier is evaluated in an "#if" directive.
    Such identifiers are replaced with zero.

原因是您的预处理器代码询问 LINUX 是否 已定义 。但是对于 MACWINDOWSBSD,您不必费心检查符号是否已定义;相反,您的代码 假定 它已定义并要求其 value.

更改您的代码以使用 #elif defined(…) 而不是 #elif … 来修复警告。