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)
.
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]构造的稳健性,如另一个答案所示.
And*_*ton 16
定义宏可以void
很好地传达您的意图.
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
Run Code Online (Sandbox Code Playgroud)
Toa*_*oad 13
#ifdef NOOP
#define conditional_noop(x)
#elif
Run Code Online (Sandbox Code Playgroud)
没有!
#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
标志时收到编译器错误.