C++ 将初始化列表传递给宏
为什么下面程序中注释掉的行不编译C++ 将初始化列表传递给宏,c++,c++11,c-preprocessor,C++,C++11,C Preprocessor,为什么下面程序中注释掉的行不编译 #include <iostream> #include <vector> using namespace std; #define F1(a) 1 int F2(vector<int>) { return 2; } int main() { vector<int> v; v = vector<int>{1,2,3}; cout << F1( v ) <
#include <iostream>
#include <vector>
using namespace std;
#define F1(a) 1
int F2(vector<int>) { return 2; }
int main() {
vector<int> v;
v = vector<int>{1,2,3};
cout << F1( v ) << endl;
//The following line doesn't compile. The error is:
//error: macro "F" passed 3 arguments, but takes just 1
//cout << F1( vector<int>{1,2,3} ) << endl; // <- error!
cout << F1( vector<int>({1,2,3}) ) << endl;
cout << F1( (vector<int>{1,2,3}) ) << endl;
cout << F2( v ) << endl;
//The following line compiles fine
cout << F2( vector<int>{1,2,3} ) << endl;
cout << F2( vector<int>({1,2,3}) ) << endl;
cout << F2( (vector<int>{1,2,3}) ) << endl;
return 0;
}
#包括
#包括
使用名称空间std;
#定义F1(a)1
int F2(向量){return 2;}
int main(){
向量v;
v=向量{1,2,3};
cout预处理器不知道{}
初始化。它看到逗号并认为这是新宏参数的开始。然后是下一个。它只知道括号()
[C++11:16.3/11]:
由最外面的匹配括号限定的预处理标记序列构成函数类宏的参数列表。列表中的各个参数由逗号预处理标记分隔,但匹配的内括号之间的逗号预处理标记不会分隔参数。[..]
宏不是函数。它将您的输入向量{1,2,3}
解释为3个输入,即向量{1
、2
和3}
。您可以通过将其设置为表达式(向量{1,2,3})
(正如您已经做过的那样)来更改它
Paranthesis中的所有内容都是一个表达式,向量(…)
是一个(*特殊成员-)函数,因此预处理器将其视为一个表达式。另一个解决方法是将宏转换为可变宏
#define F1(...) 1
或者,在更一般的情况下:
#define M(a) a
进入
有一个很好的例子和解释。有趣的是,我可以发誓我已经说过了!!(vector(…)
不是函数。)@Light Dammit-你快了一点:P我更正了它。它现在正确吗?仍然,vector(…)
这里不是函数调用。是的,我知道你好像在调用构造函数。@LightnessRacesinOrbit如果不是函数调用,那是什么?除非你的意思是构造对象不是对构造函数的显式调用。
#define M(...) __VA_ARGS__