在某些代码行中,我遇到了这个构造......
//void* v = void* value from an iterator
int i = (int)(long(v))
这种结构有什么可能的用途?
为什么不简单地使用int(v)
呢?为什么要先演员long
?
答案 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规范另有说明,否则不适合任何目的。
然而,无论出于何种原因,编写该代码的人都更喜欢int
到long
。所以他们再次交叉,并希望在int
到long
演员表中可能丢失的部分中没有任何重要信息被丢弃。
这样做的两个用途是创建一个唯一的对象标识符,或尝试以某种方式将指针打包为某种算术,否则不会被指针支持。
void*
,因此不需要转换为整数类型。ptrdiff_t
类型的差异来完成,通常是long
。