为什么我的令牌粘贴用法不起作用?

时间:2013-09-03 17:55:03

标签: c++

我做了如下声明。

#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)

有人可以告诉我我的申报有什么问题吗?非常感谢你。

3 个答案:

答案 0 :(得分:3)

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

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

您期望的地方

inline void funca() {}

答案 1 :(得分:2)

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

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

很好。

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

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

谁将被扩展为:

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

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

答案 2 :(得分:1)

定义带参数的宏

#define macro(X)

宏定义中这些参数的使用将被输入替换。

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

int main() {
    foo();
}

问题在于,有时您需要将参数作为令牌的一部分,例如如果你想拥有一个使函数调用GET_XXX的宏;你需要一种方法来告诉tokenizer将参数加入到前一个符号。这是你使用粘贴的时候。

#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的一部分。