首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么以及何时使用__noop?

为什么以及何时使用__noop?
EN

Stack Overflow用户
提问于 2013-01-22 20:57:36
回答 3查看 4K关注 0票数 20

我读到过关于__noop的文章,MSDN的例子是

代码语言:javascript
复制
#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

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

我看不到仅仅有一个空宏有什么好处:

代码语言:javascript
复制
#define PRINT

生成的代码是相同的。什么是使用__noop的有效示例,使它变得有用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-22 21:02:17

__noop内在函数指定应忽略某个函数,并对参数列表进行分析,但不会为参数生成任何代码。它适用于采用可变数量参数的全局调试函数。

在您的例子中,参数是一个明显的副作用自由表达式,可以很容易地优化出来,所以这无关紧要。

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

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

票数 17
EN

Stack Overflow用户

发布于 2013-01-22 21:05:40

代码语言:javascript
复制
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());

即使你不想得到结果,也会调用这个函数。

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

您可以(假设编译器支持各种宏)定义PRINT来忽略参数;但是,这些参数根本不会被解析,如果您在没有编译定义PRINT的变体来执行某些操作的情况下更改了它们周围的代码,那么这些参数可能会变得无效。使用__noop时,参数仍然会被解析,因此更有可能保持有效。

票数 15
EN

Stack Overflow用户

发布于 2020-03-19 20:30:48

这样如何:

代码语言:javascript
复制
if (condition)
  PRINT("hello\n");
next_statetment;

我认为,如果没有条件,在发布模式下,只有当‘__noop’为真时才会执行'next_statetment‘,这是一个很难发现的错误。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14459102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档