为什么以及何时使用__noop?

Why and when to use __noop?

提问人:Luchian Grigore 提问时间:1/22/2013 最后编辑:R SahuLuchian Grigore 更新时间:3/19/2020 访问量:5130

问:

我正在阅读有关__noop的信息,MSDN示例是

#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

int main() {
   PRINT("\nhello\n");
}

而且我看不出仅仅有一个空的宏有什么好处:

#define PRINT

生成的代码是相同的。使用它实际上有用的有效示例是什么?__noop

C Visual-C++ 内部函数

评论

0赞 Mats Petersson 1/22/2013
我想在某些情况下,“无声明”会改变事情的运作方式。不完全确定我现在能想到一个。
2赞 Steve Jessop 1/22/2013
顺便说一句,他们的示例有点狡猾,因为它在调试和发布模式下会导致不同类型的表达式。但它并不像调试模式下的类型那样狡猾,无论“参数”是什么!可变参数宏允许更好的定义和 ,这也阻止了您尝试使用 的函数指针。PRINT#define PRINT(...) ((void)printf_s(__VA_ARGS__))#define PRINT(...) ((void)0)&PRINT

答:

20赞 CodesInChaos 1/22/2013 #1

内部函数指定应忽略函数并分析参数列表,但不为参数生成代码。它旨在用于采用可变数量参数的全局调试函数。__noop

在你的例子中,这个论点是一个明显的无副作用的表达,可以很容易地优化出来,所以没关系。

但是,如果参数表达式有副作用,或者非常复杂,以至于编译器无法证明它正常终止并且没有副作用,那么使用 可以防止对该表达式进行潜在的昂贵计算。__noop

第二个好处是,它在语法上的行为类似于具有可变数量参数的函数调用。因此,用它代替函数调用不会影响程序的解析。对于其他一些替换(如空字符串),在某些情况下这可能是一个问题。

评论

0赞 Luchian Grigore 1/22/2013
是的,我想就是这样。:)
15赞 Mike Seymour 1/22/2013 #2
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());

即使您不想要结果,也会调用该函数。

使用 ,不会调用该函数。__noop

您可以(假设编译器支持可变参数宏)定义忽略参数;但是,它们根本不会被解析,并且如果您更改它们周围的代码而不编译定义执行某些操作的变体,则可能会变得无效。使用 ,参数仍会被解析,因此更有可能保持有效。PRINTPRINT__noop