让预处理器处理一段代码

我有一个系统,我在命令行上指定详细级别.在我的函数中,我检查指定的内容以确定我是否输入了代码块:

#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),但是当不在调试模式下块内的代码根本不能编译时,我经常会做类似的事情.

点赞