将初始化列表传递给宏
Passing an initialization list to a macro
为什么下面程序中注释掉的行不能编译?
#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;
}
预处理器不知道{}
初始化。它看到逗号,就认为这是一个新的宏参数的开始。然后下一个。只有括号()
是它知道的东西。
[C++11: 16.3/11]:
预处理令牌的序列由最外面匹配的圆括号包围,形成了类函数宏的参数列表。列表中的单个参数由逗号预处理标记分隔,但是匹配的内括号之间的逗号预处理标记不会分隔参数。 [. .]
宏不是函数。它将您的输入vector<int>{1,2,3}
解释为3个输入,即vector<int>{1
, 2
和3}
。您可以通过将其设置为表达式(vector<int>{1,2,3})
来改变这一点(就像您已经做的那样)。
括号中的所有内容都是表达式
vector<int>(...)
是一个(*特殊成员-)函数,因此预处理器将其视为一个表达式另一个解决方法是将MACRO转换为可变的MACRO
#define F1(...) 1
或者在更一般的情况下;转:
#define M(a) a
这:
#define M(...) __VA_ARGS__
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?