为什么当宏使用 clang 扩展时,"##"不会消失?

Why the '##' not disappear when the macro expands by using clang?

本文关键字:消失 扩展 clang 为什么      更新时间:2023-10-16

我有这样一个简单的代码:

#define THE_MACRO World
void Hello##THE_MACRO()
{
}

clang++ code.cpp -E预处理得到这样的结果:

# 1 "code.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 326 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "code.cpp" 2

void Hello##World()
{
}

请注意,##仍然保留在代码中,并将导致编译错误:

code.cpp:3:6: error: variable has incomplete type 'void'
void Hello##THE_MACRO()
     ^
code.cpp:3:11: error: expected ';' after top level declarator
void Hello##THE_MACRO()
          ^
          ;

我想不出代码出了什么问题。应该为clang提供更多的论据吗?

##运算符必须出现在宏内部。宏按照可用的顺序进行处理,但如果一个宏的结果产生了一个新的宏,也会进行处理。因此,有时您希望一个宏调用另一个实际实现功能(稍后定义)的宏,以确保正确处理参数。

所以,如果你想构建你的宏集,你可以做:

#include <iostream>
#define MERGE(A,B) MERGE_IMPL(A,B)
#define MERGE_IMPL(A,B) A ## B
#define XXX Hello
#define YYY World
void MERGE(XXX, YYY)() {
  std::cout << "Yay!" << std::endl;
}
int main() {
  HelloWorld();
}

上面的程序应该运行,正确地翻译宏,允许HelloWorld()函数被定义并从main成功调用。

按如下方式编辑宏:

#define THE_MACRO(x) x ## World()

然后:

void THE_MACRO(Hello)
{
}

正如@bmargulies所指出的,##在宏上下文中可用。