Ron*_*ean 8 c++ macros templates c-preprocessor
让我们考虑一下像这样的代码示例(它只是一个人为的例子来组合,define
并且template
不需要任何意义):
#define COMMA ,
template <typename A> class Test
{
public:
Test(){}
void Foo(A var COMMA int test);
};
Test<int> Knarz;
Run Code Online (Sandbox Code Playgroud)
题:
是我的假设是正确的说,第一预处理器将查找/替换逗号所有出现和第二编译器将实例化的顺序任何模板?
跟进:
如果上面的答案是" 是 ",正如我希望的那样,你能解释为什么使用模板和定义的解决方案有效吗?
Gri*_*zly 11
预处理器在编译本身完成之前运行,因此您假设预处理器将COMMA
在模板实例化之前替换是正确的.
对于您的后续:该解决方案与模板几乎没有关系.问题在于预处理器会将大括号内的逗号作为宏的参数分隔符,因为它不会解析C++代码以查看它是模板参数的分隔符.因此,COMMA
宏仅用于在替换,
之后插入用于分隔模板参数MOCK_CONSTANT_METHOD0
.然而,我不确定这是否有效,因为我不知道内存宏替换顺序的保证.如果COMMA
在MOCK_CONSTANT_METHOD0
一切都崩溃之前被替换并且代码再次无法编译.
编辑:在查看标准后,我认为解决方案通常应该工作,因为预处理器将MOCK_CONSTANT_METHOD0
首先找到并替换它.只有这样,它才会检查替换的结果以找到COMMA
宏.虽然没有保证.