20

我正在阅读有关__noop和 MSDN 示例是

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

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

而且我没有看到仅仅拥有一个空宏的好处:

#define PRINT

生成的代码是一样的。什么是一个__noop真正有用的有效例子?

4

3 回答 3

17

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

在您的情况下,参数显然是一个无副作用的表达式,可以轻松优化,所以没关系。

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

第二个好处是它在语法上表现得像一个带有可变数量参数的函数调用。所以用它代替函数调用不会影响程序的解析。对于其他一些替换(如空字符串),在某些情况下这可能是一个问题。

于 2013-01-22T13:02:17.453 回答
15
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());

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

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

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

于 2013-01-22T13:05:40.043 回答
-1

怎么样:

if (condition)
  PRINT("hello\n");
next_statetment;

我认为,如果没有 __noop,在发布模式下,“next_statetment”只会在“条件”为真时执行,这是一个很难找到的错误。

于 2020-03-19T12:30:47.993 回答