如何在C++;? 如何在C++中实现NOP宏?< /P> #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); } #包括 #伊夫德夫努普 #定义条件_noop(x)这里是什么? #否则 #定义条件_noop(x)std::cout
将宏定义为如何在C++;? 如何在C++中实现NOP宏?< /P> #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); } #包括 #伊夫德夫努普 #定义条件_noop(x)这里是什么? #否则 #定义条件_noop(x)std::cout,c++,c,templates,macros,C++,C,Templates,Macros,将宏定义为void可以很好地表达您的意图 #ifdef NOOP #define conditional_noop(x) (void)0 #else 没什么 您可以将其留空。你不需要遵循定义< /代码>任何东西。 这是一个宏,你也应该考虑一个类似的例子。 if (other_cond) conditional_noop(123); 为了安全起见,您可以给出一个空语句,如 #define conditional_noop(X) {} 对于较旧的C,有时您需要以这种方式定义空状
void
可以很好地表达您的意图
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
没什么 您可以将其留空。你不需要遵循<代码>定义< /代码>任何东西。 这是一个宏,你也应该考虑一个类似的例子。
if (other_cond)
conditional_noop(123);
为了安全起见,您可以给出一个空语句,如
#define conditional_noop(X) {}
对于较旧的C,有时您需要以这种方式定义空状态(也应该进行优化):
如前所述-无任何内容。
此外,您的代码中还存在打印错误。
它应该是#else而不是#elif。如果是#elif,则后面会出现新情况
#include <iostream>
#ifdef NOOP
#define conditional_noop(x) do {} while(0)
#else
#define conditional_noop(x) std::cout << (x)
#endif
#包括
#伊夫德夫努普
#定义条件_noop(x)do{}while(0)
#否则
#定义conditional_noop(x)std::cout,而将其留空是一个显而易见的选项,我同意
#define conditional_noop(x) do {} while(0)
这个技巧显然是不可行的,但它会迫使您在conditional\u noop(123)
之后写一个分号,就像其他人所说的,将其留空
您应该使用的技巧是将(void)0
添加到宏中,强制用户在宏后添加分号:
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
#define conditional_noop(x) std::cout << (x); (void)0
#endif
#ifdef NOOP
#定义条件_noop(x)(void)0
#否则
#定义条件_noop(x)std::cout#ifdef noop
静态内联void条件_noop(int x){}
#否则
静态内联void conditional_noop(int x){std::cout我认为前面的变体的组合是一个很好的解决方案:
#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
#ifdef NOOP
静态内联void条件_noop(int x)do{}while(0)
#否则
静态内联void conditional_noop(int x)do{std::您是否应该有(void)0
,因为(void);
是一个编译错误do while
技巧与编译器的年龄无关。您误解了使用do{}while(0)的原因
因此,您的第一个代码不够用,无法工作。要了解原因,请想象您的上述示例代码有一个else
分支…我无法以这种方式编译它。问题是我使用了#elif istead of#else。现在正确了。谢谢。通过在第二个宏中使用两个语句,您也可能迫使用户不这样做o在不需要大括号的情况下使用大括号,忘记大括号可能会对程序产生影响,也可能不会对程序产生影响。您链接的常见问题解答解释了如何避免该问题。+1表示唯一的问题(无论如何,到目前为止)解决方案不使用宏。但是静态
的作用是什么?最好将其作为模板,这样它就不会只接受int
?如果定义存在于包含在多个.cpp文件中的头文件中,静态会删除链接器错误。将其更改为模板函数会很好,但at将删除类型检查(特别是在定义了NOOP时,因为没有对x执行任何操作)。如果您使用msvc,您应该对其内部的\u noop
感兴趣,并且与提供的一些解决方案不同,您不会得到类似意外悬挂的结果。上述情况是不正确的。如果您在控制块中有条件noop,但没有大括号包围。请参阅avakar的解决方案,了解始终有效的健壮方法。对我来说是一个有用的答案!在我的例子中,我需要不操作一些内核级的printfs)。对于其他任何人来说,要执行变量参数noop宏,可以执行#define conditional_noop(x,…)do{}while(0)
这将留下一个编译器警告,表示表达式是常量。@Mo0gles,在msvc上会的,尽管我很惊讶你是第一个抱怨的人:)我们为此禁用了此警告。
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
#define conditional_noop(x) std::cout << (x); (void)0
#endif
#ifdef NOOP
static inline void conditional_noop(int x) { }
#else
static inline void conditional_noop(int x) { std::cout << x; }
#endif
#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