C言語なら俺に聞け(入門編)Part 115 #3

3名無しさん@Next2ch:2015/03/18(水) 11:55:24.33 ID:SMi9Fbq0

Cプリプロセッサの#(文字列化)が期待通りに展開出来ない理由と対策

test1.c
#define STR(x) #x
STR(hoge)
を展開(cc -E test.c)すると
"hoge"
と期待通りに展開できるが、
test2.c
#define STR(x) #x
#define S hoge
STR(S)
と展開すると
"S"
と期待通りの展開はされない。これからその理由と対策について述べる。

規格書に準じてCプリプロセッサがどのように展開を行っていくか追跡してみよう。
(1)-(5)まではJISX3010の6.10.3から引用する。

(1)
関数形式マクロ名の次の前処理字句として(が現れたときには,マクロ名からこの(前
処理字句に対応する)前処理字句までの前処理字句列を,この定義内の置換要素並び
で置き換える(マクロ呼び出し)
-> STR(S)をその定義によって置き換える

(2)
最も外側の括弧によって囲まれた前処理字句の列は,関数形式マクロの実引数の並び
を形成する。
-> Sが実引数


スパムを通報

このレスがスパム・荒らしである場合は以下のボタンをクリックして通報してください。
(同意できない意見などに反対票を投じる機能ではありません)
通報

このスレッドを全て表示


レスを書き込む