2012-09-08 47 views
-5

我正在瀏覽我公司的一些舊C代碼,這些代碼是在沒有gcc -flags選項的情況下編譯的,我遇到了一行奇怪的代碼。宏foo的含義(a,b,;)

#define foo(a,b) foonew(a,b, ;) 

任何人都可以向我解釋這是什麼?

編輯: 因爲它是一個大的代碼庫的一部分,不編譯gcc -flags,我看不到預處理form.Compilation是否成功完成沒有錯誤或警告。

+3

什麼是'foonew'?它是另一個宏嗎? (不管,這很奇怪) – Alex

+0

你能展示一個用例嗎? –

+0

這取決於使用的事件。最好的方法是檢查整個編譯單元的預處理形式(例如在Linux上使用'gcc -C -E')。宏可以執行許多文本操作,有些人編寫奇怪的宏。 –

回答

0

這將工作

#define foo(a,b) foonew(a,b) 

嘗試。

宏參數可以爲空(由零預處理標記組成)。例如,

#define SUM(a,b,c) a + b + c 
    SUM(1,,3) /* No error message. 

1代替a,3代替c。 */ 如果標識符列表沒有以省略號結尾,則宏調用中參數的數量必須與相應宏定義中參數的數量相同。在參數替換,其餘畢竟指定的參數的任何參數已被取代的(包括任何分離逗號)被組合成一個參數調用變量參數

1

分號工程作爲預處理標記,就像ab。它可以用作另一個宏的參數。

例如

#define foonew(x,y,z) (x + y) z 

#define foo(a,b) foonew(a,b, ;) 

int main() 
{ 
    int one = 1; 
    int two = 2; 

    int three = foo(one, two) // no semicolon here! 

    return three; 

} 
+0

此優惠有什麼優勢? – asheeshr

+0

真的沒什麼優勢,只是一個可以用宏做的瘋狂事情的​​例子。 –

相關問題