【发布时间】:2015-11-21 09:01:11
【问题描述】:
看起来,如果带有多个参数的模板实例化作为参数传递给宏,则 C++ 预处理器会失败。
请参阅下面的示例。
#include <stdio.h>
#define FOO(v) printf("%d\n",v::val())
template<int N>
struct bar {
static int val() { return N; }
};
template<int N, int M>
struct baz {
static int val() { return N+M; }
};
int main() {
printf("%d\n",bar<1>::val());
printf("%d\n",baz<1,2>::val());
FOO(bar<10>); // OK
FOO(baz<20,30>); // error: too many arguments provided to function-like macro invocation
FOO((baz<20,30>)); // error: '::val' has not been declared
}
Tested 与 clang++ 和 g++
是否应该将其视为错误?
【问题讨论】:
-
你可以设计宏来提取括号内的参数,但是这个例子当然不需要宏。
-
一个相关问题:C++ 预处理器是否知道 C++? AFAICT C++ 预处理器并没有太大变化,因为它只是 C 预处理器...... ;)
-
@chris,谢谢,根据您的消息中的措辞,我找到了类似问题的答案stackoverflow.com/questions/13842468/comma-in-c-c-macro/…
-
这个链接不错,谢谢转发
-
预处理器对 C++ 语法一无所知,它是一个非常愚蠢的宏处理器,遵循非常简单的规则。
标签: c++ templates parameters arguments c-preprocessor