为什么当宏使用 clang 扩展时,"##"不会消失?
Why the '##' not disappear when the macro expands by using clang?
我有这样一个简单的代码:
#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所指出的,##
在宏上下文中可用。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 将地址分配给本地指针后,公共对象的变量将消失
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- 当插入到CCDictionary中时,将标签添加到扩展CCNode的Cocos2d-x将消失
- 为什么当宏使用 clang 扩展时,"##"不会消失?