-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
我会收到未定义符号 MAC
和 WINDOWS
的警告,但不会收到符号 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.
它说 在 一个 #if
指令中。是因为 LINUX
不在那个结构里面吗?
如果是这样,我如何告诉编译器针对未定义的符号发出警告 LINUX
?
clang version 12.0.1
gcc (GCC) 11.1.0
Target: x86_64-pc-linux-gnu (artixlinux)
原因是您的预处理器代码询问 LINUX
是否 已定义 。但是对于 MAC
、WINDOWS
和 BSD
,您不必费心检查符号是否已定义;相反,您的代码 假定 它已定义并要求其 value.
更改您的代码以使用 #elif defined(…)
而不是 #elif …
来修复警告。
请考虑以下代码:
// 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
我会收到未定义符号 MAC
和 WINDOWS
的警告,但不会收到符号 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.
它说 在 一个
#if
指令中。是因为LINUX
不在那个结构里面吗?如果是这样,我如何告诉编译器针对未定义的符号发出警告
LINUX
?
clang version 12.0.1
gcc (GCC) 11.1.0
Target: x86_64-pc-linux-gnu (artixlinux)
原因是您的预处理器代码询问 LINUX
是否 已定义 。但是对于 MAC
、WINDOWS
和 BSD
,您不必费心检查符号是否已定义;相反,您的代码 假定 它已定义并要求其 value.
更改您的代码以使用 #elif defined(…)
而不是 #elif …
来修复警告。