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

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

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

我希望在定义NOOP时不执行任何操作,并在未定义NOOP时打印“123”。

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

 #include  #ifdef NOOP #define conditional_noop(x) do {} while(0) #else #define conditional_noop(x) std::cout << (x) #endif 

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

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

 #define conditional_noop(x) do {} while(0) 

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

  #ifdef NOOP #define conditional_noop(x) #elif 

没有!

将宏定义为void可以很好地传达您的意图。

 #ifdef NOOP #define conditional_noop(x) (void)0 #else 
 #ifdef NOOP static inline void conditional_noop(int x) { } #else static inline void conditional_noop(int x) { std::cout << x; } #endif 

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

你可以把它留空。 您无需关注#define

像其他人说的那样,留空。

你应该使用的一个技巧是向宏添加(void)0 ,强制用户在它之后添加一个分号:

 #ifdef NOOP #define conditional_noop(x) (void)0 #else #define conditional_noop(x) std::cout << (x); (void)0 #endif 

在C ++中, (void)0什么都不做。 本文将介绍其他不太好的选项,以及它们背后的基本原理。

由于这是一个宏,你也应该考虑一个例子

 if (other_cond) conditional_noop(123); 

为了安全起见,你可以给出一个空洞的陈述

 #define conditional_noop(X) {} 

对于较旧的C,有时您需要以这种方式定义空状态(也应该进行优化):

 #define conditional_noop(X) do {} while(0) 

我认为以前的变种组合是一个很好的解决方案:

 #ifdef NOOP static inline void conditional_noop(int x) do {} while(0) #else static inline void conditional_noop(int x) do { std::cout << x; } while(0) #endif 

好处是这两个代码只在一个块内有所不同,这意味着它们对于外部的行为对于解析器来说是完全相同的。