C ++预处理器__typeof

时间:2012-01-10 20:33:51

标签: c++ macros c-preprocessor

最近我发现并且我已经开始在预处理器中使用以下代码:

#define FOREACH(i,s) for(VAR(i,(s).begin()); i != (s).end(); i++)
#define VAR(a,b) __typeof(b) a=(b)

是什么让我的迭代更容易。但不幸的是,我并不完全理解第二行,尤其是__typeof关键字(以及使用这两个下划线的原因)。我还假设整个表达式__typeof(b)是一个类型转换,但是当我把它放在括号中时,为什么它不起作用?

2 个答案:

答案 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的评论!