我做了如下声明。
#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)
有人可以告诉我我的申报有什么问题吗?非常感谢你。
答案 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的一部分。