#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} ) );