如何摆脱为条件编译定义预处理器宏的需要?



我有一些C++代码编译,具体取决于某些#define。今天我错误地忘记#include带有定义的文件,这导致我的程序使用错误的代码编译。

我有哪些选择可以消除此潜在错误?

大多数编译器允许您在编译命令行中定义预处理器宏。例如,g++ 和 clang++ 有-DMACRO=VALUE

trunit.cpp

#include <iostream>
int main() {
#ifdef ALT_FOO
std::cout << "BARn";
#else
std::cout << "FOOn";
#endif // ALT_FOO
}

在您所处的当前情况下,此代码的行为将取决于是否包含定义宏ALT_FOO的头文件。您可以从构建过程本身进行控制:

$ # build the FOO variant:
$ g++ -Wall -Wextra -Werror -pedantic -O2 trunit.cpp -o foo
$ ./foo
FOO
$ # build the BARvariant:
$ g++ -Wall -Wextra -Werror -pedantic -O2 -DALT_FOO trunit.cpp -o foo
$ ./foo
BAR

将宏标头设为#define FOO#define NFOO

然后,您将测试要定义的FOONFOO中的一个

#if defined(FOO) && defined(NFOO)
#error both FOO and NFOO defined
#elif defined (FOO) 
// foo case
#elif defined (NFOO) 
// not foo case
#else
#error neither FOO nor NFOO defined
#end

最新更新