我正在阅读__noop,MSDN示例是
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}
并且我没有看到只有空宏的收益:
#define PRINT
生成的代码是相同的。什么是使用__noop
实际使其有用的有效示例?
答案 0 :(得分:17)
__noop
内在函数指定应忽略函数并解析参数列表但不为参数生成代码。它旨在用于全局调试函数可变数量的参数。
在你的情况下,论证是一个明显的副作用自由表达,可以很容易地优化出来,所以没关系。
但是如果参数表达式具有副作用或者如此复杂以至于编译器无法证明它正常终止且没有副作用,那么使用__noop
可以防止对该表达式进行潜在的昂贵评估。
第二个好处是它的行为就像一个函数调用,在语法上具有可变数量的参数。因此,将其替换为函数调用不会影响程序的解析。对于其他一些替换(如空字符串),在某些情况下可能会出现问题。
答案 1 :(得分:13)
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());
即使你不想要结果,也会调用该函数。
使用__noop
,不会调用该函数。
你可以(假设编译器支持可变参数宏)定义PRINT
来忽略参数;但是它们根本不会被解析,如果你改变它们周围的代码而不编译定义PRINT
的变量来做某事,它们可能会变得无效。使用__noop
,仍然会解析参数,因此更有可能保持有效。
答案 2 :(得分:0)
怎么样:
if (condition)
PRINT("hello\n");
next_statetment;
我认为,如果没有__noop,则只有在'condition'为true的情况下,才在发布模式下执行'next_statetment',这是一个很难找到的错误。