C++预处理器__typeof
C++ preprocessor __typeof
最近我发现并开始在预处理器中使用以下代码:
#define FOREACH(i,s) for(VAR(i,(s).begin()); i != (s).end(); i++)
#define VAR(a,b) __typeof(b) a=(b)
是什么让我的迭代更容易。但不幸的是,我不完全理解第二行,尤其是__typeof
关键字(以及为什么使用这两个下划线)。我还假设整个表达式__typeof(b)
是一个类型转换,但当我把它放在括号中时,为什么它不起作用?
__typeof(b)
不是强制转换。它是非标准C++,可与G++一起使用,意思是"b的类型"。换句话说,它是一种类型,而__typeof(b) a=(b);
是将a
定义为具有与b
相同的类型的定义,并且是从b
初始化的。所以在int b = 3;
之后,它意味着int a = b;
。
标准C++11(这是一个相当新的功能,据我所知,还没有被任何编译器完全实现)包括一个名为decltype
的类似功能。
只需假设i和s的一些实数,就可以看到它的作用:
std::list<int> list;
FOREACH(i, list)
这将在宏FOREACH(i, list)
:中解决
for(VAR(i, (list).begin()); i != (list).end(); i++)
现在解析宏VAR(i, (list).begin())
:
__typeof((list).begin()) i = (list).begin();
其中__typeof获取参数(list).begin()
的类型,在本例中为std::list<int>::iterator
std::list<int>::iterator i = (list).begin();
现在将其插入for并获取:
for(std:list<int>::iterator i = (list).begin(); i != (list).end(); i++)
正如你所看到的,__typeof部分不是类型转换,而是一个声明,所以这里的偏旁论是错误的。
还要注意为什么不特别使用宏和__typeof的许多评论!
相关文章:
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 如何摆脱为条件编译定义预处理器宏的需要?
- C 预处理器 - 现有定义的预置路径
- VS2015 预处理器定义与点
- 不带预处理器的调用方法/文件的文件名/行号
- 获取文件数据预处理器宏
- 有没有办法在 c++ 中拥有条件预处理器
- 如何在编译时定义C++预处理器指令的值?
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- 如何确定我的处理器有多少个 AVX 寄存器?