比如我有一個宏:C宏中的#x是什麼意思?
#define PRINT(int) printf(#int "%d\n",int)
我還挺知道是什麼結果。 但是,爲什麼要用#int來代替整個事情呢?
我有點忘了這個細節。任何人都可以給我一個提示嗎?
謝謝!
比如我有一個宏:C宏中的#x是什麼意思?
#define PRINT(int) printf(#int "%d\n",int)
我還挺知道是什麼結果。 但是,爲什麼要用#int來代替整個事情呢?
我有點忘了這個細節。任何人都可以給我一個提示嗎?
謝謝!
在此上下文中(應用於宏定義中的參數引用),井號表示將此參數擴展爲傳遞給宏的參數的文本文本。
在這種情況下,如果您撥打PRINT(5)
宏展開將爲printf("5" "%d\n", 5);
,將打印5 5
;不是很有用;但是如果你打電話PRINT(5+5)
宏展開將printf("5+5" "%d\n", 5+5);
這將打印5+5 10
,少一點瑣碎。
這個例子在this tutorial on the C preprocessor(其中,順便說一句,是第一次谷歌擊中c macro pound sign)中解釋。
是這個gcc功能還是ANSi C標準? –
@AndersLind:這是標準行爲。請參閱§6.10.3.2/ 2,其中詳細介紹了'#'運算符的語義。 – dreamlax
@dreamlax哇,謝謝。我從來沒有在我的10年編程生活中使用它...該死!..我在大多數時間編程C++ –
這是宏參數名稱的錯誤選擇,但無害(謝謝dreamlax)。
基本上,如果我寫像這樣
PRINT(5);
它都會被替換成
printf("5" "%d\n",5);
或
printf("5 %d\n",5);
它是一種稱爲Stringification過程,#int被替換爲由其內容組成的字符串,5 - >「5」
該宏由預處理它不具有C型系統的知識。據我所知「int」不會違反§6.10(預處理指令)中的任何規則,但我同意這是一個不好的選擇。 – dreamlax
您與鏈接文檔的鏈接已死亡,請更新。 – DeathByTensors
@DrewBuckley固定! –
「#」 可以顯示一個變量,它更好地定義宏,因爲這名:
#define PRINT(i) printf(#i "= %d\n", i)
,並使用它像這樣:顯示
int i = 5;
PRINT(i);
結果:
i = 5
Possbible重複的這個http://stackoverflow.com/questions/10676999/stringizing-operator – Omkant