如何在C++中实现no-op宏(或模板)?

Ant*_*yko 25 c c++ macros templates

如何在C++中实现no-op宏?

#include <iostream>   

#ifdef NOOP       
    #define conditional_noop(x) what goes here?   
#else       
    #define conditional_noop(x) std::cout << (x)   
#endif   
int main() {       
    conditional_noop(123);   
}
Run Code Online (Sandbox Code Playgroud)

我希望在定义NOOP时不执行任何操作,并且在未定义NOOP时打印"123".

ava*_*kar 52

虽然留空是显而易见的选择,但我会选择

#define conditional_noop(x) do {} while(0)
Run Code Online (Sandbox Code Playgroud)

这个技巧显然是无操作,但强迫你在之后写一个分号conditional_noop(123).

  • 对我有帮助的答案!就我而言,我需要不操作某些内核级别的printfs)。对于其他在这里看的人,要做一个可变参数的noop宏,可以做#define conditional_noop(x,...)做{} while(0)`。 (2认同)

And*_*rew 24

如前所述 - 没有.
此外,您的代码中存在错误打印.
它应该是#else而不是#elif.如果它是#elif,则后面跟着新条件

#include <iostream>   

#ifdef NOOP       
    #define conditional_noop(x) do {} while(0)
#else       
    #define conditional_noop(x) std::cout << (x)   
#endif  
Run Code Online (Sandbox Code Playgroud)

玩得开心!编辑:添加[do]构造的稳健性,如另一个答案所示.

  • 以上是不正确的.如果你在一个没有大括号包围的控制块内有conditional_noop.请参阅avakar的解决方案,了解始终有效的强大方法. (9认同)

And*_*ton 16

定义宏可以void很好地传达您的意图.

#ifdef NOOP
    #define conditional_noop(x) (void)0
#else
Run Code Online (Sandbox Code Playgroud)

  • 你应该有`(void)0`,因为`(void);`是一个编译错误 (6认同)

Toa*_*oad 13

 #ifdef NOOP       
     #define conditional_noop(x)   
 #elif  
Run Code Online (Sandbox Code Playgroud)

没有!


Nic*_*not 6

#ifdef NOOP
    static inline void conditional_noop(int x) { }
#else 
    static inline void conditional_noop(int x) { std::cout << x; }
#endif
Run Code Online (Sandbox Code Playgroud)

使用内联函数void可以启用类型检查,即使NOOP未定义也是如此.因此,当NOOP未定义时,您仍然无法将结构传递给该函数或未定义的变量.这将最终阻止您在打开NOOP标志时收到编译器错误.


Jus*_*tin 5

你可以把它留空.你不需要跟随#define任何东西.