2013-01-16 151 views
25

比如我有一個宏:C宏中的#x是什麼意思?

#define PRINT(int) printf(#int "%d\n",int) 

我還挺知道是什麼結果。 但是,爲什麼要用#int來代替整個事情呢?

我有點忘了這個細節。任何人都可以給我一個提示嗎?

謝謝!

+0

Possbible重複的這個http://stackoverflow.com/questions/10676999/stringizing-operator – Omkant

回答

29

在此上下文中(應用於宏定義中的參數引用),井號表示將此參數擴展爲傳遞給宏的參數的文本文本。

在這種情況下,如果您撥打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)中解釋。

+0

是這個gcc功能還是ANSi C標準? –

+2

@AndersLind:這是標準行爲。請參閱§6.10.3.2/ 2,其中詳細介紹了'#'運算符的語義。 – dreamlax

+0

@dreamlax哇,謝謝。我從來沒有在我的10年編程生活中使用它...該死!..我在大多數時間編程C++ –

4

這是宏參數名稱的錯誤選擇,但無害(謝謝dreamlax)。

基本上,如果我寫像這樣

PRINT(5); 

它都會被替換成

printf("5" "%d\n",5); 

printf("5 %d\n",5); 

它是一種稱爲Stringification過程,#int被替換爲由其內容組成的字符串,5 - >「5」

+1

該宏由預處理它不具有C型系統的知識。據我所知「int」不會違反§6.10(預處理指令)中的任何規則,但我同意這是一個不好的選擇。 – dreamlax

+0

您與鏈接文檔的鏈接已死亡,請更新。 – DeathByTensors

+1

@DrewBuckley固定! –

9

「#」 可以顯示一個變量,它更好地定義宏,因爲這名:

#define PRINT(i) printf(#i "= %d\n", i) 

,並使用它像這樣:顯示

int i = 5; 
PRINT(i); 

結果:

i = 5