#
文字列化( )またはトークン貼り付け( )前処理演算子を正しく使用するための通常のイディオムは##
、第2レベルの間接参照を使用することです。(##プリプロセッサ演算子のアプリケーションと考慮すべき落とし穴は何ですか?)
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)
それで:
int main( int argc , char const *argv[] )
{
int abc_def_ghi = 42;
#define SUFFIX ghi
#define VAR(prefix) PASTE( prefix, PASTE( _def_, SUFFIX))
printf( "%d\n" , VAR(abc) );
return 0;
}
あなたが探している結果をあなたに与えるはずです。
基本的に、何が起こるかというと、#
and##
演算子の処理はマクロ置換の前に行われます。次に、マクロ置換の別のラウンドが発生します。したがって、これらの操作と一緒にマクロを使用する場合は、単純に置換を行う第1レベルを使用する必要があります。そうしないと、文字列化または貼り付けが最初に行われ、マクロはマクロではなくなります。ストリング化/貼り付けにより生成されます。
より直接的に言えば、最初のレベルのマクロではマクロパラメータを置き換えることができ、次に2番目のレベルのマクロ置換では文字列化/トークン貼り付け操作を実行します。