2

私は方法を知りたいと思ってい//まし"たが、以下のようにマクロ置換に渡すことができます:

#define STR(str) #str

STR(hel"lo)またはの呼び出し中STR(hel//lo)。これによりエラーが発生します。これらをマクロに渡す方法はありますか?

4

3 に答える 3

2

行末へのコメントの開始を示すマーク//として文字列または文字定数に埋め込む以外に、マクロ呼び出しに渡す方法はありません。//コメントの削除は、マクロが処理される前に行われます。

同様に、裸の二重引用符をマクロに渡す方法はありません。二重引用符は、文字定数内にあるか、文字列の開始を示しています。

/*およびについても同様に'、推論に適切な変更を加えます。

于 2012-06-26T15:31:30.270 に答える
0

ID マクロと評価文字列化マクロを指定すると、

#define ID(X) X
#define STR_EVAL(X) STR(X)

1 つのスラッシュを「エスケープ」できます

STR_EVAL( ID(hel)ID(/)/lo )

一重引用符については、申し訳ありませんが、運が悪いです。マクロへの引数はトークンである必要があり、一重引用符をトークンにすることは特に禁止されています。

于 2014-06-16T12:50:23.307 に答える
0

いいえ、あなたが書いたようにそれらを渡す方法はありません。翻訳フェーズ 3 は、「ソース ファイルを前処理トークンとコメントを含む一連の空白に分解する」です。

つまり、STR(hel//lo) は STR(hel (コメントの代わりに末尾のスペースを使用) に変換されます。

「前処理トークンのカテゴリは、ヘッダー名、識別子、pp 番号、文字定数、文字列リテラル、句読点、および他の前処理トークン文字と字句的に一致しない単一の非空白文字です。' または " 文字が最後の文字、動作は定義されていません" ... つまり、STR(hel"lo) も許可されていません。

于 2012-06-26T15:32:52.173 に答える