1

以下のように宣言しました。

#define FUNC_DEC(f) inline void f##(){}

class MyClass
{
public:
    FUNC_DEC(a);
    FUNC_DEC(b);
};

前処理後、クラスは次のようになると予想しました。

class MyClass
{
public:
    inline void a(){};
    inline void b(){};
};

実際には、コンパイルエラーが発生しました

#20 identifier "a" is undefined
#20 identifier "b" is undefined

warnings
Description Resource    Path    Location    Type
#891-D omission of explicit type is nonstandard ("int" assumed)

私の宣言の何が問題なのか誰か教えてもらえますか? どうもありがとう。

4

3 に答える 3

1

引数付きのマクロを定義する場合

#define macro(X)

マクロ定義でのこれらの引数の使用は、入力に置き換えられます。

#define macro(X) void X() {}
macro(foo) // becomes void foo() {}

int main() {
    foo();
}

問題は、トークンの一部として引数が必要になる場合があることです。たとえば、GET_XXX という関数を作成するマクロが必要な場合などです。トークナイザーに引数を前のシンボルに結合するように指示する方法が必要です。これは、貼り付けを使用する場合です。

#define getfn(X) void get_##X() {} // '##X' is replaced with the value of X.

macro(foo) // becomes void get_foo() {}

int main() { get_foo(); }

もし私たちが書いていたら

#define getfn(X) void get_X() {}

コンパイラは、'X' が単一のリテラル文字列 get_X の一部であると認識していたでしょう。

于 2013-09-03T18:17:43.203 に答える