私は方法を知りたいと思ってい//
まし"
たが、以下のようにマクロ置換に渡すことができます:
#define STR(str) #str
STR(hel"lo)
またはの呼び出し中STR(hel//lo)
。これによりエラーが発生します。これらをマクロに渡す方法はありますか?
私は方法を知りたいと思ってい//
まし"
たが、以下のようにマクロ置換に渡すことができます:
#define STR(str) #str
STR(hel"lo)
またはの呼び出し中STR(hel//lo)
。これによりエラーが発生します。これらをマクロに渡す方法はありますか?
行末へのコメントの開始を示すマーク//
として文字列または文字定数に埋め込む以外に、マクロ呼び出しに渡す方法はありません。//
コメントの削除は、マクロが処理される前に行われます。
同様に、裸の二重引用符をマクロに渡す方法はありません。二重引用符は、文字定数内にあるか、文字列の開始を示しています。
/*
およびについても同様に'
、推論に適切な変更を加えます。
ID マクロと評価文字列化マクロを指定すると、
#define ID(X) X
#define STR_EVAL(X) STR(X)
1 つのスラッシュを「エスケープ」できます
STR_EVAL( ID(hel)ID(/)/lo )
一重引用符については、申し訳ありませんが、運が悪いです。マクロへの引数はトークンである必要があり、一重引用符をトークンにすることは特に禁止されています。
いいえ、あなたが書いたようにそれらを渡す方法はありません。翻訳フェーズ 3 は、「ソース ファイルを前処理トークンとコメントを含む一連の空白に分解する」です。
つまり、STR(hel//lo) は STR(hel (コメントの代わりに末尾のスペースを使用) に変換されます。
「前処理トークンのカテゴリは、ヘッダー名、識別子、pp 番号、文字定数、文字列リテラル、句読点、および他の前処理トークン文字と字句的に一致しない単一の非空白文字です。' または " 文字が最後の文字、動作は定義されていません" ... つまり、STR(hel"lo) も許可されていません。