我正在使用##
(令牌粘贴运算符(来形成一个函数调用。
根据我的理解,一个简单的例子可能是这样的。
#include <iostream>
#define CALL(x) Func_##x##()
void Func_foo() { std::cout << "Hi from foo()." << std::endl; }
int main() {
std::cout << "Hello World!" << std::endl;
CALL(foo);
return 0;
}
我用g++ -std=c++14 -O3 test.cc
编译了这段代码。G++版本为7.3.1。它返回以下错误。
error: pasting "Func_foo" and "(" does not give a valid preprocessing token
如果我将宏更改为#define CALL(x) Func_##x()
(删除第二个##
(,错误将得到解决。
为什么第二个##
是多余的?##
连接字符串,并在可能的情况下用宏参数替换。例如,我将函数名称更改为Func_foo1()
,则宏应为#define CALL(x) Func_##x##1()
。这正如我所期望的那样。
我对宏定义#define CALL(x) Func_##x()
有点困惑。
标记是C++程序中对编译器有意义的最小元素。
##
标记粘贴运算符不会连接任意可打印字符。它将两个标记连接为一个标记。
为什么第二个##是多余的?
因为级联Func_foo
和()
不会生成单个令牌。