2016-09-21 81 views
1

鑑於下面的代碼,打印一個字符串,它是兩個詞的字符串化:字串宏總是添加單個空格字符

#define PORT_INFO_MAC_2(portNum) port:  portNum 

#define PORT_INFO_MAC(portNum) PORT_INFO_MAC_2(portNum) 

/* Stringify macro expansion instead of the macro itself */ 
#define INVOKE_MACRO(...) #__VA_ARGS__ 

printf(" %s " , INVOKE_MACRO(PORT_INFO_MAC(1))); /* In a more general way, I'll be using it like follows: INVOKE_MACRO(PORT_INFO_MAC(2), PORT_INFO_MAC(1), ...) */ 

輸出始終" port: 1 ""port""1"之間的單個空間。爲什麼總是有一個空間,有沒有辦法控制空間的數量?

更改PORT_INFO_MAC_2宏之間的空格量portportNum之間的宏不會更改輸出空間量。

編輯
看來,有兩種情況,在拳情況下,portportNum是closest- PORT_INFO_MAC_2(portNum) port:portNum然後沒有空間在他們之間的輸出存在。在第二種情況下,它們之間的宏中存在任意數量的空格,輸出中空格的數量總是爲1. 對此有任何正式的解釋嗎?是否有任何控制權?

+2

注意:「空格鍵」是鍵盤上生成_space_字符的大按鈕。 – Olaf

回答

2

爲什麼總是有一個空間,有沒有辦法控制空間的數量?

,因爲這是該字符串化操作被指定做:

如果替換列表中,一個參數立即被#之前預處理記號,無論是由單一字符串文字替換預處理標記,其中包含相應參數的預處理標記序列的拼寫。 參數的預處理記號之間每出現一個空格,都會成爲字符串文字中的單個空格字符。

(C2011 6.10.3.2/2;強調)

當然,如果沒有空白的預處理標記之間的話,那麼沒有出現在字符串化。

+0

現貨。你能提供一個到源文件的鏈接嗎? – user2162550

+0

@ user2162550,我通常指[N1570草案的PDF版本](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)。我的答案包含章節和段落號碼。你可以通過谷歌搜索「n1570」找到其他版本,包括HTML格式。最終的標準文件不是免費提供的,但它與N1570只有微不足道的差別。 –

相關問題