【发布时间】:2013-06-14 04:30:58
【问题描述】:
我经常在 C 代码中使用类似对象的预处理器宏作为布尔标志来打开和关闭代码部分。
例如
#define DEBUG_PRINT 1
然后像这样使用它
#if(DEBUG_PRINT == 1)
printf("%s", "Testing");
#endif
但是,如果忘记将包含#define 的头文件包含在源代码中,则会出现问题。由于未声明宏,预处理器将其视为等于 0,并且#if 语句永远不会运行。
当忘记包含头文件时,可能会出现意想不到的、不守规矩的行为。
理想情况下,我希望能够在一行中检查是否定义了宏,并检查它是否等于某个值。如果未定义,预处理器会抛出错误(或警告)。
我正在寻找类似的东西:
#if-def-and-true-else-throw-error(DEBUG_PRINT)
...
#endif
就像#ifdef 和#if 的组合,如果不存在,则使用#error。
我已经探索了一些途径,但是,预处理器指令不能在 #define 块内使用,据我所知,如果未定义宏,则没有预处理器选项可以引发错误/警告在#if 语句中使用时。
【问题讨论】:
-
编译器无法将你从一切中拯救出来......
-
对。那么您想要的是将
print函数包装在宏或其他函数中,而不是将其包装在所有调用位置。然后,您可以将错误生成代码整合到一个地方,而不是试图将其散布在您的项目中。 -
您可能很容易忘记使用
#if-def-and-true-else-throw-error(DEBUG_PRINT)而不是#if DEBUG_PRINT == 1,因此即使存在此功能也不会产生任何有用的效果。 -
如果你在头文件中定义了 PrintDebug——这是它的逻辑位置——那么如果不包含头文件,代码将无法编译。
-
gcc有一个选项 (-Wundef) 可以在#if指令中评估未定义的标识符时生成警告。
标签: c macros c-preprocessor directive