首先是什么 - 模板实例化与宏扩展?

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.然而,我不确定这是否有效,因为我不知道内存宏替换顺序的保证.如果COMMAMOCK_CONSTANT_METHOD0一切都崩溃之前被替换并且代码再次无法编译.

编辑:在查看标准后,我认为解决方案通常应该工作,因为预处理器将MOCK_CONSTANT_METHOD0首先找到并替换它.只有这样,它才会检查替换的结果以找到COMMA宏.虽然没有保证.