6

関数を動的に作成するマクロ (C/C++) を作成しようとしています。基本的に、「MyClassA」の部分で名前が異なる関数があります。また、引数はマクロ定義を介して渡す必要があります。次に、関数内に可変メソッド呼び出しがあります。たとえば、"methodForClassA" などで、ここでも可変引数セットが使用されます。

void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) {
Toolbox.methodForClassA(arg1, arg2);
}

このパターンには 40 以上の関数があります。もちろん、手動またはスクリプトで作成できます。しかし、マクロでこれを行うことも可能ですか? たとえば、次のようなものです (これは機能しません)。

# define MACRO_TEST(classname, methodname, args, argsMethod) void Java_somepackage_##classname_fixMethod(##args) {\
    Toolbox.##methodname(##argsMethod);\
} 
MACRO_TEST(MyClassA, methodForClassA, args1, args2)

いくつかの実験とドキュメントの読み取りの後、「(」が動的部分に続くパターンで「動的」関数名を作成する方法しか見つけられませんでした。

#define FUNCTION(name, x) int func_##name() { return x;}
FUNCTION(test, 2);

よろしく、

4

1 に答える 1

6

##シンボル貼り付け演算子の目的を誤解している可能性があると思います。マクロ引数を使用するたびに前に置く必要はありません##。他のテキストと一緒に貼り付けて、出力に 1 つのシンボルを作成する場合にのみ使用します。したがって、おそらく必要になるでしょうが、どこでも必要になるわけではありません。

したがって、これはより近いです:

# define MACRO_TEST(classname, methodname, args, argsMethod) \
void Java_somepackage_##classname##_fixMethod(args) {\
    Toolbox.methodname(argsMethod);\
} 
MACRO_TEST(MyClassA, methodForClassA, args1, args2)

ただし、これはまだ機能しません。あなたのargsパラメータには、可変数のパラメータが含まれていると思います。C の新しいバージョンには、 「変数マクロ パラメーター」と呼ばれるものがありますが、私はそれらを使用したことがありません。または、次のように、マクロ呼び出しでパラメーターを括弧で囲むこともできます。

# define MACRO_TEST(classname, methodname, args, argsMethod) \
void Java_somepackage_##classname##_fixMethod args  {\
    Toolbox.methodname argsMethod;\
} 
MACRO_TEST(MyClassA, methodForClassA, (int arg1, int arg2), (arg1, arg2))
于 2011-11-27T19:05:21.440 に答える