在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语句中使用宏时未定义宏,则没有预处理器选项可以抛出错误/警告。
发布于 2013-06-18 05:21:54
这在一般情况下可能不适用(我不认为您所要求的东西有一个通用的解决方案),但是对于您的具体示例,您可能会考虑更改以下代码序列:
#if(DEBUG_PRINT == 1)
printf("%s", "Testing");
#endif至:
if (DEBUG_PRINT == 1) {
printf("%s", "Testing");
}它不再冗长,如果没有定义DEBUG_PRINT,或者如果它被定义为无法与1相比的东西,那么它将无法编译。
发布于 2013-06-18 05:06:52
据我所知,如果在
#if语句中使用宏时未定义宏,则没有预处理器选项可以抛出错误/警告。
这不可能是一个错误,因为C标准指定行为是合法的。来自国际标准化组织C99标准第6.10.1/3节:
在执行了宏展开和
defined一元运算符的所有替换之后,所有剩余的标识符都被pp-number0替换.
然而,正如compilers在下面的评论中所指出的,一些编译器(比如gcc)可以发布关于它的警告。但是,由于用0代替未识别的预处理器令牌的行为是合法的(而且在许多情况下是可取的),我希望在实践中启用这样的警告会产生大量的噪声。
没有办法完全按照你的意愿去做。如果要在未定义宏的情况下生成编译失败,则必须显式执行
#if !defined DEBUG_PRINT
#error DEBUG_PRINT is not defined.
#endif对于每个关心的源文件。或者,您可以将宏转换为类似函数的宏,并避免使用#if。例如,您可以定义一个DEBUG_PRINT宏,该宏扩展为用于调试生成的printf调用,但对于非调试生成则扩展为零。任何忽略包含定义宏的头的文件都将无法编译。
编辑:
关于可取性,我曾多次看到代码使用:
#if ENABLE_SOME_CODE
...
#endif而不是:
#ifdef ENABLE_SOME_CODE
...
#endif这样,#define ENABLE_SOME_CODE 0就会禁用代码,而不是启用它。
发布于 2013-06-18 05:26:19
与其在源文件中直接使用DEBUG_PRINT,不如将其放在头文件中:
#if !defined(DEBUG_PRINT)
#error DEBUG_PRINT is not defined
#endif
#if DEBUG_PRINT
#define PrintDebug([args]) [definition]
#else
#define PrintDebug
#endif任何使用PrintDebug但不包括头文件的源文件都将无法编译。
如果需要调用PrintDebug以外的其他代码来基于DEBUG_PRINT编译,请考虑使用Michael关于使用普通if而不是#if的建议(是的,优化器不会在错误的常量测试中生成代码)。
编辑:而且您可以将上面的PrintDebug概括为包含或排除任意代码,只要您没有类似宏参数的逗号:
#if !defined(IF_DEBUG)
#error IF_DEBUG is not defined
#endif
#if IF_DEBUG
#define IfDebug(code) code
#else
#define IfDebug(code)
#endif然后你就可以写一些东西
IfDebug(int count1;) // IfDebug(int count1, count2;) won't work
IfDebug(int count2;)
...
IfDebug(count1++; count2++;)https://stackoverflow.com/questions/17160755
复制相似问题