让预处理器处理一段代码

时间:2011-12-30 00:40:48

标签: c optimization c-preprocessor

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

#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)块中但我更喜欢它,如果有某种方式我可以让预处理器实际抛出整个块远。可以吗?

3 个答案:

答案 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;”开头的条件如果你想完全禁用它。除非您在没有任何优化的情况下编译,否则编译器通常会删除死代码。