2012-02-16 73 views
2

一位同事請我在memcached中解釋一下C代碼。我承認我也不明白這一點。c函數類似的宏與參數列表,但沒有替換列表?

它與C函數類似的宏定義的參數沒有替換列表。例如,起始於線2751在memcached.c:

  if (return_cas) 
      { 
       MEMCACHED_COMMAND_GET(c->sfd, ITEM_key(it), it->nkey, 
            it->nbytes, ITEM_get_cas(it)); 
       /* Goofy mid-flight realloc. */ 
       if (i >= c->suffixsize) { 
       char **new_suffix_list = realloc(c->suffixlist, 
             sizeof(char *) * c->suffixsize * 2); 
       if (new_suffix_list) { 
        c->suffixsize *= 2; 
        c->suffixlist = new_suffix_list; 

MEMCACHED_COMMAND_GET()在trace.h裏上線23所定義:

#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2, arg3, arg4) 

C代碼宏功能狀帶參數的定義,確定。沒有替換名單。

上memcached.c CPP的輸出顯示函數宏變成「;」:

# 2751 "memcached.c" 
      if (return_cas) 
      { 
       ; 


       if (i >= c->suffixsize) { 
       char **new_suffix_list = realloc(c->suffixlist, 
             sizeof(char *) * c->suffixsize * 2); 
       if (new_suffix_list) { 
        c->suffixsize *= 2; 
        c->suffixlist = new_suffix_list; 

沒有人有任何瞭解爲什麼程序員將包括函數宏沒有替換列表像MEMCACHED_COMMAND_GET()那樣對生成的代碼沒有影響?這樣做的目的是什麼?提前謝謝你。

+1

你可能想看看這個問題:http://stackoverflow.com/questions/5501990/what-c​​an-the-macros-below-be-used-for – Jason 2012-02-16 16:37:39

+0

@Jason非常好,謝謝。這就說得通了。我從來沒有想過要在MEMCACHED_COMMAND_GET本身上搜索,只搜索包含「類似功能的宏」的術語。我感謝你指引我朝着正確的方向。 – 2012-02-16 16:44:03

回答

2

在Solaris和Mac OSX上,它會被替換爲觸發DTrace探針,以便擴展爲其他內容。

+0

它看起來可能是memcached_dtrace.h,只有在定義了ENABLE_DTRACE的情況下,纔會從memcached_dtrace.d創建這些擴展。聰明,聰明。在我的Ubuntu系統上缺少memcached_dtrace.h文件讓我矇騙了。謝謝! – 2012-02-16 17:02:03

+2

不客氣(畢竟我是那個加了它的人;-)) – trondn 2012-02-16 17:17:56

1

它可能與可移植性問題有關:例如,與BSD相關但不在Linux上的一段代碼。或相反亦然。

我不能說這裏的具體情況,但這可能是一個原因。