我正在瀏覽我公司的一些舊C代碼,這些代碼是在沒有gcc -flags
選項的情況下編譯的,我遇到了一行奇怪的代碼。宏foo的含義(a,b,;)
#define foo(a,b) foonew(a,b, ;)
任何人都可以向我解釋這是什麼?
編輯: 因爲它是一個大的代碼庫的一部分,不編譯gcc -flags
,我看不到預處理form.Compilation
是否成功完成沒有錯誤或警告。
我正在瀏覽我公司的一些舊C代碼,這些代碼是在沒有gcc -flags
選項的情況下編譯的,我遇到了一行奇怪的代碼。宏foo的含義(a,b,;)
#define foo(a,b) foonew(a,b, ;)
任何人都可以向我解釋這是什麼?
編輯: 因爲它是一個大的代碼庫的一部分,不編譯gcc -flags
,我看不到預處理form.Compilation
是否成功完成沒有錯誤或警告。
這將工作
#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。 */ 如果標識符列表沒有以省略號結尾,則宏調用中參數的數量必須與相應宏定義中參數的數量相同。在參數替換,其餘畢竟指定的參數的任何參數已被取代的(包括任何分離逗號)被組合成一個參數調用變量參數
分號工程作爲預處理標記,就像a
和b
。它可以用作另一個宏的參數。
例如
#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;
}
此優惠有什麼優勢? – asheeshr
真的沒什麼優勢,只是一個可以用宏做的瘋狂事情的例子。 –
什麼是'foonew'?它是另一個宏嗎? (不管,這很奇怪) – Alex
你能展示一個用例嗎? –
這取決於使用的事件。最好的方法是檢查整個編譯單元的預處理形式(例如在Linux上使用'gcc -C -E')。宏可以執行許多文本操作,有些人編寫奇怪的宏。 –