我有一个系统,我在命令行上指定详细级别.在我的函数中,我检查指定的内容以确定我是否输入了代码块:
#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)块中,但我更喜欢它,如果有某种方式我可以让预处理器实际抛出整个块.可以吗?
最佳答案 如果不将整个块包装在宏中,我无法想到一种方法.
但这可能适用于您的目的:
#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),但是当不在调试模式下块内的代码根本不能编译时,我经常会做类似的事情.