如何在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
好处是这两个代码只在一个块内有所不同,这意味着它们对于外部的行为对于解析器来说是完全相同的。