提问人:Luchian Grigore 提问时间:1/22/2013 最后编辑:R SahuLuchian Grigore 更新时间:3/19/2020 访问量:5130
为什么以及何时使用__noop?
Why and when to use __noop?
问:
我正在阅读有关__noop的信息,MSDN示例是
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
而且我看不出仅仅有一个空的宏有什么好处:
#define PRINT
生成的代码是相同的。使用它实际上有用的有效示例是什么?__noop
答:
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
您可以(假设编译器支持可变参数宏)定义忽略参数;但是,它们根本不会被解析,并且如果您更改它们周围的代码而不编译定义执行某些操作的变体,则可能会变得无效。使用 ,参数仍会被解析,因此更有可能保持有效。PRINT
PRINT
__noop
下一个:四舍五入到最接近的数字的倍数
评论
PRINT
#define PRINT(...) ((void)printf_s(__VA_ARGS__))
#define PRINT(...) ((void)0)
&PRINT