#if 0作为定义

val*_*rio 12 macros c-preprocessor

我需要一种方法来定义一个FLAGS_IF宏(或等价物)

FLAGS_IF(expression)
<block_of_code>
FLAGS_ENDIF
Run Code Online (Sandbox Code Playgroud)

在调试中编译时(例如,使用特定的编译器开关)编译为

if (MyFunction(expression))
{
    <block_of_code>
}
Run Code Online (Sandbox Code Playgroud)

而在发布中不会产生任何指令,就像它是这样的

#if 0
    <block_of_code>
#endif
Run Code Online (Sandbox Code Playgroud)

在我对C/C++预处理器问题的无知中,我无法想到这样做的任何天真的方式(因为#define FLAGS_IF(x) #if 0甚至没有编译),你能帮忙吗?

我需要一个解决方案:

  • 如果*/内部存在,不会搞砸<block_of_code>
  • 即使在任何深度的内联函数内也一定会在发布中生成0条指令(我想这不包括在内if (false){<block_of_code>}吗?)
  • 如果可能,是否符合标准

Han*_*ant 30

宏是非常邪恶的,但没有什么比使用宏来模糊控制语句和块更邪恶了.编写这样的代码是没有充分理由的.做到这一点:

#ifdef DEBUG
  if (MyFunction(expression))
  {
    <block_of_code>
  }
#endif
Run Code Online (Sandbox Code Playgroud)

  • 我会再拍这个.像这样的宏的问题是你创建自己的语言.这是一种维护代码的人必须在没有书籍或学校的情况下学习的语言.更严重的是,它是一种你不会解析自己的语言.您无法创建良好的错误消息,以帮助有人在宏爆炸时解决问题.它现在看起来很吸引人,后来它将成为一个主要的皮塔饼.它会*爆炸. (20认同)
  • 我想你需要亲自遇到"来自地狱的增强C/C++代码库"才能在这里实现nobugz评论的深度.我可以保证他太对了.我亲眼看到的宏既没有比调试块更多也没有更少的免费. (5认同)
  • 我不认为这个解决方案与您在打字方面接受的解决方案有任何不同. (2认同)

bra*_*amp 11

以下应该做你想要的:

#ifdef DEBUG
# define FLAGS_IF(x) if (MyFunction((x))) {
# define FLAGS_ENDIF }
#else
# define FLAGS_IF(x) if(0) {
# define FLAGS_ENDIF }
#endif
Run Code Online (Sandbox Code Playgroud)

if(0)应该变成没有指令,或者至少它会在大多数编译器中这样做.

编辑:Hasturkun评论说你真的不需要FLAGS_ENDIF,所以你会改为编写你的代码:

FLAGS_IF(expression) {
   <block_of_code>
}
Run Code Online (Sandbox Code Playgroud)

使用以下宏:

#ifdef DEBUG
# define FLAGS_IF(x) if (MyFunction((x)))
#else
# define FLAGS_IF(x) if(0)
#endif
Run Code Online (Sandbox Code Playgroud)


Fry*_*Guy 7

我可能会这样做:

#ifdef DEBUG
const bool IS_RELEASE_MODE = false;
#else
const bool IS_RELEASE_MODE = true;
#endif

if (IS_RELEASE_MODE && MyFunction(expression))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这应该从发布版本中编译出来,因为if(false && f())与if(false)相同,后者在大多数编译器中得到优化.

如果您坚持不在代码内部使用#ifdef,那就是这样.否则,我更喜欢别人发布的#ifdef DEBUG if(MyFunction(expression)){...} #endif.