【发布时间】:2021-10-19 17:22:02
【问题描述】:
请考虑以下代码:
// 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 手册页:
-
它说 in 是一个
#if指令。是不是因为LINUX不在那个结构里面? -
如果是这种情况,我如何告诉编译器为未定义符号
LINUX发出警告?
clang version 12.0.1gcc (GCC) 11.1.0Target: x86_64-pc-linux-gnu (artixlinux)
【问题讨论】:
-
#ifdef LINUX/#if defined(LINUX)如果您对此发出警告,那将毫无意义... -
尝试将
elif MAC更改为elif defined(MAC)。WINDOWS和BSD也是如此。这样,您的代码将测试是否定义了所有宏,而不是(现在)测试是否定义了LINUX,同时测试其他宏扩展为的值。 -
@Jarod42 是的,你是对的!
-
@Peter 完全正确!没有定义(MAC),它会扩展符号,如果符号没有定义,编译器(或预处理器)首先发出警告,然后用
0替换未定义的符号,这样分支就会被删除。
标签: c++ compiler-warnings preprocessor