令牌粘贴运算符粘贴"Func_foo"和"("不会提供有效的预处理令牌



我正在使用##(令牌粘贴运算符(来形成一个函数调用。

根据我的理解,一个简单的例子可能是这样的。

#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()不会生成单个令牌。

最新更新