Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在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 - Fatal编程技术网

如何在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