2012-06-11 148 views
5

考慮變量宏宏擴展以下Ç(忽略雙副作用的問題):與參數與具有相同名稱

#define max(a, b) (a>b?a:b) 

int main(void){ 
    int max = max(5,6); 
    return max; 
} 

GCC的預處理器輪流到這一點:

int main(void){ 
    int max = (5>6?5:6); 
    return max; 
} 

這是相當不錯的,因爲你不必擔心maxmax()之間無意的碰撞。 GCC manual說:

類似函數的宏只有在它的名字出現時帶有一對括號後才被展開。如果你只是寫出這個名字,那麼它就被單獨留下了。

這是標準化還是隻是按照慣例做的事情?

回答

5

是的,這裏的行爲是明確的。

您的宏max是一個函數宏(即,當你定義它,它的名字立即由左括號其次,它需要參數)。

稍後在代碼中使用max只是在使用max後跟左括號時調用該宏。因此,這些不會調用max宏:

int max; 
max = 42; 

但這些都會調用最大宏:

max(1, 2) 
max (1, 2) 
max 
(
    1, 2 
) 
max() 

(請注意,是形成不良的最後一行,因爲參數的個數不匹配的參數的數量。這仍然是一個宏調用,不過,會導致編譯錯誤。)

這種行爲是由C的langauge標準規定。 C99§6.10.3/ 10指出,後一函數宏已定義,

的函數宏名稱,後跟一個(作爲下一預處理標記的每個後續的實例介紹了預處理標記的序列它被定義中的替換列表(宏的調用)取代。

+0

我很困惑。它看起來像海灣合作委員會榮幸的最大宏,並沒有改爲調用真正的最大功能。 – octopusgrabbus

+0

@octopusgrabbus:什麼'max'功能? –

+0

發現了GCC手冊中的相關部分,但我仍然不知道這是標準化還是非正式的約定 – mensi

相關問題