C++预处理器__typeof

C++ preprocessor __typeof

本文关键字:typeof 处理器 预处理 C++      更新时间:2023-10-16

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

#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的许多评论!