2011-12-30 76 views
4

我有一个系统,我可以在命令行中指定详细级别。在我的功能,我核对指定什么来确定,如果我输入一个代码块或不:让预处理器处理一段代码

#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

请清楚声明“verbose_get_bit”之外的语句(如果有的话)可能会有所不同。 – outis 2011-12-30 00:52:15

+0

@ BrianTompsett-汤莱恩:这不适用于C++吗? – usr2564301 2016-04-05 20:21:33

回答

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),但我经常做一些类似的,当块中的代码将不能编译当不在调试模式时。

+0

我不知道整个块可能被用作宏参数。如果定义了具有多个参数的宏,并且在发送给该宏的块的中间有逗号,该怎么办?无论如何,这绝对是一个选项,虽然看起来很奇怪。 – 2011-12-30 00:51:34

+0

即使在块中的逗号之间,它实际上仍然可以工作。无论哪种方式,如果您需要多个语句,您需要用'{}'来包装它。 – Mysticial 2011-12-30 00:54:36

+0

所以预处理器会根据'{}'跟踪范围吗?很高兴知道。 – 2011-12-30 00:57:47

1

没有任何地方像你刚刚做的那样整齐。别担心,编译器会全面优化任何if(0)块。

如果你愿意的话,你可以通过编写一个程序来检查它,如你所描述的那样,并编译它。如果删除if(false)块,它应该编译为完全相同的二进制文件,如MD5散列所示。但这不是必要的,我保证你的编译器可以搞清楚它!

+0

这是一个很好的无痛检查方法。谢谢! – 2011-12-30 00:47:29

+0

许多编译器(包括VC++)在重复编译时都不会生成来自相同源的逐字节相同的二进制文件。 – ildjarn 2011-12-30 00:49:43

+0

的确如此,但是如果让程序尽可能简单,那么它更有可能。 – Dan 2011-12-30 00:54:49

-1

刚刚创建的if语句是一个条件开头“假& &”,如果你想拥有它完全禁用。除非您没有进行任何优化编译,否则编译器通常会删除死代码

+0

我已经在很多场合做过很多次了,作为一种快速的方式来“评论出“一些代码。 – 2011-12-30 00:49:55