这个C ++构造有什么作用?

时间:2010-05-01 21:52:54

标签: c++ casting

在某些代码行中,我遇到了这个构造......

//void* v = void* value from an iterator
int i = (int)(long(v))

这种结构有什么可能的用途?

为什么不简单地使用int(v)呢?为什么要先演员long

2 个答案:

答案 0 :(得分:8)

它很可能会使警告无声。

假设32位架构的sizeof(int)< sizeof(long)和sizeof(long)== sizeof(void *)如果你将void *转换为int,你可能会得到一个警告,如果你没有截断,你可以在没有警告的情况下将void *转换为long。然后,您会收到一个警告,指定long到int(可能的截断),然后通过显式从long转换为int来删除。

在不知道编译器的情况下很难说,但我确实看到了防止警告所需的多步演员表。为什么不尝试将构造转换为您认为应该是什么,并查看编译器所说的内容(当然,如果您使用相同的编译器和相同的警告级别,这只会帮助您找出原始程序员的想法)因为他们是。)

答案 1 :(得分:3)

它确实是eeevil。

在大多数体系结构中,指针可以被认为只是另一种数字。在大多数体系结构中,long与指针一样多,因此long值和指针之间存在一对一的映射。但违规行为,特别是第二条规则,并不罕见!

long(v)reinterpret_cast<long>(v)的别名,不保证。除非您的ABI规范另有说明,否则不适合任何目的。

然而,无论出于何种原因,编写该代码的人都更喜欢intlong。所以他们再次交叉,并希望在intlong演员表中可能丢失的部分中没有任何重要信息被丢弃。

这样做的两个用途是创建一个唯一的对象标识符,或尝试以某种方式将指针打包为某种算术,否则不会被指针支持。

  • 不透明标识符可以是void*,因此不需要转换为整数类型。
  • 从指针“提取”整数(例如除法运算)总是可以通过减去基指针来获得ptrdiff_t类型的差异来完成,通常是long