我读到过关于__noop的文章,MSDN的例子是
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() {
PRINT("\nhello\n");
}我看不到仅仅有一个空宏有什么好处:
#define PRINT生成的代码是相同的。什么是使用__noop的有效示例,使它变得有用?
发布于 2013-01-22 21:02:17
__noop内在函数指定应忽略某个函数,并对参数列表进行分析,但不会为参数生成任何代码。它适用于采用可变数量参数的全局调试函数。
在您的例子中,参数是一个明显的副作用自由表达式,可以很容易地优化出来,所以这无关紧要。
但是,如果参数表达式有副作用,或者非常复杂,以至于编译器不能证明它正常终止并且没有副作用,那么使用__noop可以防止对该表达式进行可能代价高昂的计算。
第二个好处是,它的行为就像一个函数调用,在语法上具有可变数量的参数。因此,将其替换为函数调用不会影响程序的解析。使用其他一些替代方法(如空字符串),在某些情况下可能会出现问题。
发布于 2013-01-22 21:05:40
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());即使你不想得到结果,也会调用这个函数。
使用__noop,函数将不会被调用。
您可以(假设编译器支持各种宏)定义PRINT来忽略参数;但是,这些参数根本不会被解析,如果您在没有编译定义PRINT的变体来执行某些操作的情况下更改了它们周围的代码,那么这些参数可能会变得无效。使用__noop时,参数仍然会被解析,因此更有可能保持有效。
发布于 2020-03-19 20:30:48
这样如何:
if (condition)
PRINT("hello\n");
next_statetment;我认为,如果没有条件,在发布模式下,只有当‘__noop’为真时才会执行'next_statetment‘,这是一个很难发现的错误。
https://stackoverflow.com/questions/14459102
复制相似问题