Luc*_*ore 19 c++ intrinsics visual-c++
我正在阅读__noop和MSDN示例
#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif
int main() {
   PRINT("\nhello\n");
}
我没有看到只有空宏的好处:
#define PRINT
生成的代码是相同的.什么是使用__noop它的有效例子实际上使它有用?
Cod*_*aos 17
在
__noop一个函数应该被忽略内在指定和参数列表解析,但对于参数不会产生代码.它适用于采用可变数量参数的全局调试函数.
在你的情况下,论证是一个明显的副作用自由表达,可以很容易地优化出来,所以没关系.
但是,如果参数表达式具有副作用或者如此复杂以至于编译器无法证明它正常终止并且没有副作用,那么使用__noop该表达式会阻止对该表达式的潜在昂贵的评估.
第二个好处是它的行为就像一个函数调用,在语法上具有可变数量的参数.因此,将其替换为函数调用不会影响程序的解析.使用其他一些替换(如空字符串),在某些情况下可能会出现问题.
Mik*_*our 14
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());
即使你不想要结果,也会调用该函数.
使用时__noop,不会调用该函数.
你可以(假设编译器支持可变参数宏)定义PRINT忽略参数; 但是它们根本不会被解析,如果你改变它们周围的代码而不编译定义PRINT做某事的变体,它们可能会变得无效.使用时__noop,仍会解析参数,因此更有可能保持有效.