这个C++构造是做什么的?
某处的代码行,我碰到这个结构...这个C++构造是做什么的?
//void* v = void* value from an iterator
int i = (int)(long(v))
可以在此contruct起到什么可能的目的是什么?
为什么不简单地用int(v)
代替?为什么首先投到long
?
它最有可能使警告无声。假设32位体系结构的sizeof(int)< sizeof(long)和sizeof(long)== sizeof(void *),你可能会得到一个警告,如果你将一个void *一个void *,只要你不截断。然后,你会得到一个警告,将一个long赋值给一个int(可能的截断),然后通过从long明确地转换为int来移除它。
不知道编译器很难说,但我已经看到了防止警告所需的多步转换。为什么不尝试将构造转换为您认为应该的内容,并查看编译器所说的内容(当然,如果您使用相同的编译器和相同的警告级别,只会帮助您计算出原始程序员的想法因为他们是)。
@Len Holgate:我正在使用的机器上sizeof'void * = 8,long = 8,int = 4'。 – Moeb 2010-05-06 13:22:50
它确实是eeevil。
在大多数体系结构中,指针可以被认为是另一种类型的数字。在大多数体系结构中,long
与指针的位数相同,因此long
值与指针之间有1对1映射。但违规行为,特别是第二条规则,并不罕见!
long(v)
是reinterpret_cast<long>(v)
的别名,它不承担任何保证。除非您的ABI规范另有说明,否则不适合用于任何目的。
但是,无论出于何种原因,编写该代码的人更喜欢int
至long
。所以他们再次交叉他们的手指,并希望没有必要的信息被扔在可能丢失在int
到long
剧组中的位中。
这样做的两个用途是创建一个唯一的对象标识符,或试图以某种方式打包指针,否则某些算法不支持指针。
- 不透明标识符可以是
void*
,因此不需要转换为整型。 - “从指针中提取整数”(例如除法操作)总是可以通过减去一个基指针来获得类型为
ptrdiff_t
的差异,通常是long
。
在GUI代码中看到它。 – 2010-05-01 22:21:44
单独为邪恶+1。 – GManNickG 2010-05-01 22:25:42
或者它可能不会做坏事。例如,'void *'可能是一个不透明的用户数据项,它正在通过函数传递给回调函数,例如线程启动数据。给调用者最大的灵活性是一个'void *'。调用者可能会传递一个整数值,并且可能希望在调用的另一端获得它。在Windows上,你最近可能会将用户数据视为'ULONG_PTR',这很可能会将对cast的需求移除为'long',但是仍然需要将该类型转换为'int',并且在这种情况下,它是不是邪恶的,但设计可能会更好。 – 2010-05-01 23:34:45
小心给更多的上下文? – 2010-05-01 21:55:57
@James Morris:我认为这是所有需要的信息......我从容器中得到'void *'值,而这些void *值实际上是整数(它们被当作void *)。现在我想要那些整数回来。我已经在问题中提到过了。 – Moeb 2010-05-01 21:59:01
我宁愿问他们为什么要在一个表达式中混合使用两种不同的表达式:) – AnT 2010-05-01 22:04:58