【发布时间】:2017-10-28 02:22:42
【问题描述】:
#include <vector>
struct Foo { int a, b, c; };
int main()
{
Foo myFoo = Foo{ 1, 2, 3 };
std::vector<Foo> listOfFoos;
listOfFoos.push_back(Foo{ 1, 2, 3 });
#define push(x) listOfFoos.push_back(x)
push(Foo{ 1, 2, 3 } ); // Error
}
错误是:
> "Expected a '}'"
> "Syntax error: expected a ')' not '}'" "Syntax
> error: missing ')' before ';'"
我在 Visual Studio 上花了很长时间才试图弄清楚发生了什么。直到我在使用 GCC 的在线编译器上编译时,我才得到一个更具描述性的错误:
错误:宏“push”传递了 3 个参数,但只需要 1 个
我想我很困惑,因为我认为 std::initializer_list 是一个结构,应该作为一个传递。当它抱怨将 3 个参数传递给宏时,它是在说 push({1, 2, 3});我正在做相当于 push(1, 2, 3);?这似乎 std::initializer_list 在解析宏时在预编译器阶段之前对其元素进行了一种扩展。我不明白这是为什么。另外,我尝试将它包装在另一组括号中并且它有效:
push( ( {1, 2, 3} ) );
【问题讨论】:
-
您的结构声明-
struct Foo { int a, b, c; };错误。应该是struct Foo { int a; int b; int c; }; -
@H.S.你确定吗?像这样的声明或 int a = 1, b = 2, c = 3;在课外都很好,除非在课堂上有针对这些的特殊规则......
-
斑马鱼:哎呀..我的错,忽略我的评论。
-
整个逗号也让我感到困惑。有一整篇关于 C 逗号运算符的维基百科文章,我只明白了一半,显然它评估所有逗号分隔的表达式,但只返回最后一个,所以在一个例子中,有人问下面的循环做了什么似乎有两个条件:for(i=0; j>=0, i
标签: c++ c++11 macros stdinitializerlist