我有一个系统,我在命令行中指定详细级别。在我的函数中,我检查指定的内容以确定我是否输入了代码块:
#ifdef DEBUG
if (verbose_get_bit(verbose_level_1)) {
// arbitrary debugging/printing style code generally goes in here, e.g.:
printf("I am printing this because it was specified and I am compiling debug build\n");
}
#endif
我想让这个设置不那么繁琐,所以这就是我到目前为止所拥有的:
// from "Verbose.h"
bool verbose_get_bit(verbose_group_name name); // verbose_group_name is an enum
#ifdef DEBUG
#define IF_VERBOSE_BIT_D(x) if (verbose_get_bit(x))
#else // not debug: desired behavior is the entire block that follows gets optimized out
#define IF_VERBOSE_BIT_D(x) if (0)
#endif // not debug
现在,我可以这样做:
IF_VERBOSE_BIT_D(verbose_GL_debug) {
printf("I don't want the release build to execute any of this code");
glBegin(GL_LINES);
// ... and so on
}
我喜欢这个,因为它看起来像一个if语句,它起到if语句的作用,很明显它是一个宏,并且它不会在发布版本中运行。
我有理由相信代码会被优化掉,因为它将被包装在if(false)
块中但我更喜欢它,如果有某种方式我可以让预处理器实际抛出整个块远。可以吗?
答案 0 :(得分:2)
如果没有将整个块包装在宏中,我无法想到这样做。
但这可能适用于您的目的:
#if DEBUG
#define IF_VERBOSE_BIT_D(x) {x}
#else
#define IF_VERBOSE_BIT_D(x)
#endif
IF_VERBOSE_BIT_D(
cout << "this is" << endl;
cout << "in verbose" << endl;
printf("Code = %d\n", 1);
)
实际上,编译器应该能够优化if (0)
,但是当块内的代码在不处于调试模式时根本无法编译时,我经常会做类似的事情。
答案 1 :(得分:1)
不像你刚才那样整洁。不用担心,您的编译器将完全优化任何if(0)
块。
如果您愿意,可以通过编写一个程序来检查这一点,在该程序中您可以按照描述并编译它。如果然后删除if(false)
块,它应该编译为完全相同的二进制文件,如MD5哈希所示。但这没有必要,我保证你的编译器可以解决它!
答案 2 :(得分:-1)
只需在if语句中创建一个以“false&amp;&amp;”开头的条件如果你想完全禁用它。除非您在没有任何优化的情况下编译,否则编译器通常会删除死代码。