2

概念的にこれに似た何かをしようとしていますが、それを機能させることができないようです(最後にエラーが表示されています)。

#include <stdio.h>

int main( int argc , char const *argv[] )
{
  int abc_def_ghi = 42;
  #define SUFFIX ghi
  #define VAR(prefix) prefix##_def_##SUFFIX
  printf( "%d\n" , VAR(abc) );
  return 0;
}

// untitled:8: error: ‘abc_def_SUFFIX’ undeclared (first use in this function)
4

3 に答える 3

11

追加の間接参照が必要です。

#include <stdio.h>

int main( int argc , char const *argv[] )
{
  int abc_def_ghi = 42;
  #define SUFFIX ghi
  #define VAR3(prefix, suffix) prefix##_def_##suffix
  #define VAR2(prefix, suffix) VAR3(prefix, suffix)
  #define VAR(prefix) VAR2(prefix, SUFFIX)
  printf( "%d\n" , VAR(abc) );
  return 0;
}

冗長に見えますが、そうではありません。

于 2009-11-20T01:06:00.980 に答える
7

#文字列化( )またはトークン貼り付け( )前処理演算子を正しく使用するための通常のイディオムは##、第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番目のレベルのマクロ置換では文字列化/トークン貼り付け操作を実行します。

于 2009-11-20T08:27:47.207 に答える
0

これは、十分なレベルの間接参照で機能します。別の答えで十分ですが、このコードのチャンクをデモとして提供したいと思います。

#define SUFFIX ghi

#define VAR1(prefix) prefix##_def_##SUFFIX
VAR1(abc)

#define VAR2_(prefix, sfx) prefix##_def_##sfx
#define VAR2(prefix) VAR2_(prefix,SUFFIX)
VAR2(abc)

#define VAR3_(prefix, sfx) prefix##_def_##sfx
#define VAR3x(prefix,sfx) VAR3_(prefix,sfx)
#define VAR3(prefix) VAR3x(prefix,SUFFIX)
VAR3(abc)

これをテキストファイルxcとして保存し、前処理するだけです。

gcc -E x.c

観察し、熟考します。私はそれを完全に理解していません。stringifyを使用してマクロを取得するために2時間を費やすだけです。二重間接参照が必要になる場合があるのは興味深いことです。

于 2010-01-16T22:09:33.107 に答える