2014-08-31 13 views
4

我對K & R 2nd Ed,p.90中有關宏的解釋有些困惑。以下是該段落:在printf中使用數字符號的宏

形式參數在引用字符串中不會被替換。但是,如果替換文本中的參數名稱前面有一個#,則該組合將被擴展爲帶引號的字符串,並將參數替換爲實際參數。

我不確定第二句話在說什麼。它繼續用「調試打印宏」來解釋這個用法。

這可以用字符串連接進行組合,例如,調試打印宏:

#define dprint(expr) printf(#expr " = %g\n", expr); 

編輯:

所有的意見十分有益。感謝你們。

回答

5

如果你定義的宏是這樣的:

#define MAKE_STRING(X) #X 

然後,你可以做這樣的事情:

puts(MAKE_STRING(a == b)); 

這將擴大到:

puts("a == b"); 

dprint()例子,它會打印出表達式的字符串形式以及表達式值。

dprint(sin(x)/2); 

將業務拓展到:

printf("sin(x)/2" " = %g\n", sin(x)/2); 

字符串文字串聯將把第一個參數是一個字符串字面。

2

#expr擴展爲"expr"。相鄰的兩個字符串文字會自動連接在一起。我們可以看到,調用gcc -Edprint(test)會給下面的輸出:

("test" " = %g\n"); 
3

這僅僅是一個實用的功能,您可以在宏參數轉換成一個字符串文字,主要是用於調試。所以

dprint(x + y); 

是由C預處理器擴展到這個

printf("x + y = %g\n", x + y); 

注意參數expr的價值如何出現兩個字符串文字,也由宏生成的代碼中。要發生這種情況,您需要在expr前加上#來創建字符串文字。

值得指出的一件事是,相鄰的字符串文字被合併成單個字符串文字,例如,"x + y" " = %g\n"合併爲"x + y = %g\n"

0

This網站可能會有所幫助。它描述瞭如何實現字符串化。