2011-04-28 93 views

回答

7

這樣就可以將整個參數列表傳遞給宏,並讓它傳遞給一個帶有可變數量參數的函數。

我敢打賭任何宏觀的定義是:

#if DEBUG /* or something like it */ 
#define KdPrint(args) (printf args) 
#else 
#define KdPrint(args) /* empty */ 
#endif 

或相近的工作就像printf的一些其他功能。

如果它被定義爲printf(args),那麼您只能傳遞單個字符串參數,因爲宏的參數不能包含不在嵌套圓括號內的逗號。

+0

你可能是對的!但是我認爲編寫這個宏的人做得不好。他應該圍繞'args'放置括號。 – 2011-04-28 02:34:01

+2

不,重點是逗號可能不止一個,所以它在宏外面加括號。 – Random832 2011-04-28 02:37:42

+0

明白了,謝謝 – 2011-04-28 02:44:00

3

它導致在parens內的所有東西都被視爲宏的單個參數。在顯示的例子,它可以允許可變參數類型的參數:

KdPrint(("My info is %s\n", "my name")); 

至於以及

KdPrint(("fn %s ln %s\n", "my", "name")); 
3

如果有問題的宏並沒有使用括號寫得很好,可能是因爲運營商是必要的優先。就拿這個宏例如:

#define MY_MACRO(a) a * 11 

好吧,如果你這樣做:

int b = MY_MACRO(1 + 2); 

b,的而不是33像它應該,實際上與int b = 1 + 2 * 11這是23而不是33來代替。如果你的宏不是這樣寫的,儘管(沒有圍繞a的括號),那就沒有必要了。

+0

雖然對宏觀陷阱有深入的瞭解,但如果這確實是問題,那麼KdPrint會在宏本身中放置括號。它更可能是a)它需要將所有參數傳遞給一個接受可變數量參數的函數,或者b)它試圖與不支持__VA_ARGS__的預處理器兼容,這意味着您必須傳遞所有參數作爲一個單一的宏參數,直到它們達到功能級別。 – 2013-08-08 21:47:40

0

對於您的具體示例,我無法告訴您,因爲我不知道XdPrint是什麼。

但在更一般的情況下,這是因爲我喜歡搜索和替換的宏。假設你有:

#define MULT(a,b) (a*b) 

如果你打電話MULT(1+1, 2+2),它會成爲1+1*2+2,並導致作爲5而不是8正如你期望的那樣。做MULT((1+1), (2+2))會給你預期的結果。這就是爲什麼你需要加倍括號。

1

如果this是您所說的KdPrint(),那麼這是因爲您可以使用帶格式參數的KdPrint()宏,而且它不是可變長度的宏。

例如,你可以這樣做:

KdPrint(("The answer is %d\n", 42)); 

等。

相關問題