在未定义的对象上使用 #if 时编译器 warning/error

Compiler warning/error when using #if on something that is undefined

考虑以下示例:

#define FOO false
#if FOO
void foo(){}
#endif

显然,foo()不存在。但是当我忘记定义FOO时,结果是一样的:

#if FOO
void foo(){}
#endif

有什么方法可以根据 FOO 有条件地 foo() {},但是 自动 FOO 时产生警告或错误 根本没有定义? (即不手动使用 #ifndef FOO - #error 之类的东西)

您可以执行以下操作:

#if defined(FOO)
void foo() {}
#else
#error FOO is not defined
#endif

如果未定义 FOO,则此代码将无法编译。编译器会报错。

此外,尽管使用未定义的宏不是错误(它的计算结果为 0),you can make it one 通过将以下内容添加到您的 GCC 或 Clang 命令行:

-Wundef -Werror

但请注意,所有 警告现在都将被视为错误,您将变得依赖构建设置。所以我更喜欢 #else 的显式方法和 #error 指令,如果你打算依靠它来捕获错误的配置。

可以使用宏函数,然后会有警告:

#define FOO() false
#if FOO()