对于调试,我有很多调用我的应用程序中的调试日志功能。当然,在生产版本中,这些调试调用需要被跳过。而是写:调试和预处理指令
#if DEVEL == 1
Log::debug(...);
#endif
绕到调试功能,我决定所有调用写在调试功能本身如下:
#if DEVEL != 1
return;
#endif
将无用的函数调用的开销由编译器来避免或者我为了性能的原因使用(许多丑陋的)#if #endif
构建更好?
对于调试,我有很多调用我的应用程序中的调试日志功能。当然,在生产版本中,这些调试调用需要被跳过。而是写:调试和预处理指令
#if DEVEL == 1
Log::debug(...);
#endif
绕到调试功能,我决定所有调用写在调试功能本身如下:
#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
,并看看输出。
并打开优化器: - O或-O3 – 2011-06-12 22:39:09
不错。但是,为什么#else版本没有参数? – 2011-06-12 11:35:59
@Kerrek,因为只有2个条件。如果它不是'DEVEL == 1',那么它肯定会是'DEVEL!= 1'。 – iammilind 2011-06-13 03:31:44
没有抱歉,我的意思是为什么LOG_DEBUG的第一个版本有参数(括号),但第二个版本没有?如果你写了'LOG_DEBUG(“hello”)',那么第二个宏就会扩展到'“hello”',而不是什么? – 2011-06-13 09:15:54