最近我发现并且我已经开始在预处理器中使用以下代码:
#define FOREACH(i,s) for(VAR(i,(s).begin()); i != (s).end(); i++)
#define VAR(a,b) __typeof(b) a=(b)
是什么让我的迭代更容易。但不幸的是,我并不完全理解第二行,尤其是__typeof
关键字(以及使用这两个下划线的原因)。我还假设整个表达式__typeof(b)
是一个类型转换,但是当我把它放在括号中时,为什么它不起作用?
答案 0 :(得分:3)
__typeof(b)
不是演员。它是非标准的C ++,可用于G ++,意思是“b的类型”。换句话说,它是一种类型,__typeof(b) a=(b);
是一个定义,它将a
定义为与b
具有相同的类型,并从b
初始化。因此,在int b = 3;
之后,它意味着int a = b;
。
标准C ++ 11(相当新,我所知道的任何编译器尚未完全实现)包含一个名为decltype
的大致相似的功能。
答案 1 :(得分:2)
为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和get:
for(std:list<int>::iterator i = (list).begin(); i != (list).end(); i++)
正如您所看到的__typeof部分没有类型转换而是声明,所以那里的paranthesis是错误的。
还要注意许多关于为什么不在特殊情况下使用宏和__typeof的评论!