2011-03-31 78 views
3
#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2, arg3, arg4) 
#define MEMCACHED_COMMAND_GET_ENABLED() (0) 

上面的宏似乎完全沒用,它們可以用於什麼?下面的宏可用於什麼?

回答

10

這些宏可能有幾種定義,您將根據編譯標誌選擇一個或另一個。 這使得實例調試信息僅在內置調試模式時才提供。

例如,在memcached_dtrace.h,有一樣的東西:

#if ENABLE_DTRACE 
... 
#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2) \ 
    __dtrace_memcached___command__get(arg0, arg1, arg2) 
#define MEMCACHED_COMMAND_GET_ENABLED() \ 
    __dtraceenabled_memcached___command__get() 
... 
#else 
... 
#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2) 
#define MEMCACHED_COMMAND_GET_ENABLED() (0) 
... 
#endif 

這些命令只有當ENABLE_DTRACE在編譯的時候被激活,做一些事情。

+1

空的宏擴展爲空行,它們被編譯爲空。當您在啓用調試標誌的情況下進行編譯時,將'LOG'宏定義爲'fprintf'的別名,或者在禁用調試標誌時將其展開爲空白,這也是將日誌消息包含在代碼中的常用方式。瞧,沒有調試信息,並在運行時不放慢,以確定是否打印它們。 – Jonathan 2011-03-31 15:15:33

+1

['assert()'](http://pubs.opengroup.org/onlinepubs/007908799/xsh/assert.h.html)是這種行爲的另一個常見例子。 – 2011-03-31 16:25:42