在未定义的对象上使用 #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()
考虑以下示例:
#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()