2016-09-21 4 views
1

を追加します。文字列化マクロは常に2つの単語の文字列化された文字列を出力し、次のコードを考えると、単一のスペース文字

#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 "です。なぜそこに1つのスペースがあり、スペースの量を制御する方法があるのですか?

PORT_INFO_MAC_2マクロのスペース量をportportNumの間で変更しても、出力スペースは変更されません。 2例があるようです

EDIT
、拳のケースでportportNumは、それらの間の出力に存在する、その後スペースなしclosest- PORT_INFO_MAC_2(portNum) port:portNumです。 2番目のケースでは、それらの間にマクロ内にスペースがいくつも存在する場合、出力のスペースは常に1です。 正式な説明はありますか?それ以上のコントロールはありますか?

+2

注: "spacebar"は_space_文字を生成するキーボードの大きなボタンです。 – Olaf

答えて

2

なぜ単一のスペースが常にあり、スペースの量を制御する方法はありますか?

それは文字列化演算子が行うことに指定されているものだからです。

置換リストで、パラメータはすぐに#前処理トークンが先行する、場合、両方がリテラル単一の文字列に置き換えられます対応する引数の前処理トークン・シーケンスのスペルを含む前処理トークン。 引数の前処理トークンの間の空白の各出現は、文字列リテラル内の単一の空白文字になります。

(C2011 6.10.3.2/2;強調を追加)

もちろん前のトークンの間に全く空白が存在しない場合、その後、いずれも文字列化に表示されていません。

+0

Spot on。ソース文書へのリンクを提供できますか? – user2162550

+0

@ user2162550については、一般的に[N1570ドラフトのPDF版](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)を参照してください。私の答えは、セクションと段落番号が含まれています。 HTMLレンディションを含む他のバージョンは、「n1570」のグーグルで見つけることができます。最終的な標準文書は無料で入手することはできませんが、N1570との間には些細な違いしかありません。 –

関連する問題