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

3

在这种情况下,您不需要“令牌粘贴”。只有当你有这样的东西时,这才有用:

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

你期望的地方

inline void funca() {}
于 2013-09-03T17:57:30.060 回答
2

在这种情况下,您不需要使用##运算符。

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

很好。

它是连接运算符,对这种情况很有用:

#define FUNC_DEC(f) inline void FuncDec##f(){}
//                              ^^^^^^^^^^

谁将扩展为:

inline void FuncDeca(){}   // FUNC_DEC(a)

只是说:您的代码在 Visual Studio 上运行良好。

于 2013-09-03T18:00:41.983 回答
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 回答