为了调试,我在我的应用程序中有许多调用调试日志函数的代码。当然,在生产版本中,这些调试调用需要被跳过。不要写成:
#if DEVEL == 1
Log::debug(...);
#endif
在调用debug函数时,我决定在debug函数本身中编写以下内容:
#if DEVEL != 1
return;
#endif
编译器是否会避免无用函数调用的开销,还是出于性能考虑最好使用(很多丑陋的)#if #endif
结构?
为了调试,我在我的应用程序中有许多调用调试日志函数的代码。当然,在生产版本中,这些调试调用需要被跳过。不要写成:
#if DEVEL == 1
Log::debug(...);
#endif
在调用debug函数时,我决定在debug函数本身中编写以下内容:
#if DEVEL != 1
return;
#endif
编译器是否会避免无用函数调用的开销,还是出于性能考虑最好使用(很多丑陋的)#if #endif
结构?
不必担心优化器,你可以使用一个简单的技巧:
#if DEVEL == 1
#define LOG_DEBUG(...) Log::Debug(__VA_ARGS__) // variadic macro
#else
#define LOG_DEBUG
#endif
LOG_DEBUG
。为什么不自己检查一下呢?
使用gcc编译命令时,只需添加-S
选项,查看输出结果即可。
DEVEL == 1
,那么肯定是DEVEL != 1
。 - iammilindLOG_DEBUG("hello")
,那么第二个宏会扩展为"hello"
,而不是空的,对吧? - Kerrek SB