4

プリプロセッサライブラリのセットを含むライブラリを使用しています。__VA_ARGS__それらの1つは、を繰り返し、引数ごとにユーザー提供のマクロを呼び出すFOR_EACHスタイルのマクロです。ユーザー提供のマクロは次のように呼び出されます。SOME_MACRO(current_arg)

ただし、問題は、単一の引数を取るユーザー提供のマクロでのみ機能することです。structaの名前と構造体の各フィールドの両方を含む特別なことをしようとしています。問題は、これにはマクロに対して2つの引数が必要なことです。

私が使用しているライブラリは単項マクロのみを受け入れるので、マクロに追加の引数を「バインド」する方法はありますか?

今のところ、マクロで構造体の名前をハードコーディングする必要があります。したがって、struct私が作業している名前が、である場合、私はFoo言わなければなりません:

#define MY_MACRO(FIELD) /* do something with &Foo::FIELD */

STRUCTどういうわけか、マクロに2番目の引数を「バインド」して、ライブラリがマクロを呼び出すときに、次のように展開できるようにすることができますか。

#define MY_MACRO(FIELD) /* do something with &STRUCT::FIELD */
4

1 に答える 1

5

はい。以下のテクニックを使用できます。

#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()

以下のテストコードでの使用法:

struct foo { static int f() { return 0; } };
struct STRUCT { static int f() { return 1; } };

#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()

int main ()
{
  int i = MY_MACRO((STRUCT,f)); // see here braces inside braces
}

上記のコードは次のように展開されます。

int main ()
{
  int i = STRUCT::f();
}
于 2011-05-21T17:16:28.393 に答える