这个C++构造是做什么的?

这个C++构造是做什么的?

问题描述:

某处的代码行,我碰到这个结构...这个C++构造是做什么的?

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

可以在此contruct起到什么可能的目的是什么?

为什么不简单地用int(v)代替?为什么首先投到long

+5

小心给更多的上下文? – 2010-05-01 21:55:57

+0

@James Morris:我认为这是所有需要的信息......我从容器中得到'void *'值,而这些void *值实际上是整数(它们被当作void *)。现在我想要那些整数回来。我已经在问题中提到过了。 – Moeb 2010-05-01 21:59:01

+2

我宁愿问他们为什么要在一个表达式中混合使用两种不同的表达式:) – AnT 2010-05-01 22:04:58

它最有可能使警告无声。假设32位体系结构的sizeof(int)< sizeof(long)和sizeof(long)== sizeof(void *),你可能会得到一个警告,如果你将一个void *一个void *,只要你不截断。然后,你会得到一个警告,将一个long赋值给一个int(可能的截断),然后通过从long明确地转换为int来移除它。

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

+0

@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规范另有说明,否则不适合用于任何目的。

但是,无论出于何种原因,编写该代码的人更喜欢intlong。所以他们再次交叉他们的手指,并希望没有必要的信息被扔在可能丢失在intlong剧组中的位中。

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

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

在GUI代码中看到它。 – 2010-05-01 22:21:44

+2

单独为邪恶+1。 – GManNickG 2010-05-01 22:25:42

+0

或者它可能不会做坏事。例如,'void *'可能是一个不透明的用户数据项,它正在通过函数传递给回调函数,例如线程启动数据。给调用者最大的灵活性是一个'void *'。调用者可能会传递一个整数值,并且可能希望在调用的另一端获得它。在Windows上,你最近可能会将用户数据视为'ULONG_PTR',这很可能会将对cast的需求移除为'long',但是仍然需要将该类型转换为'int',并且在这种情况下,它是不是邪恶的,但设计可能会更好。 – 2010-05-01 23:34:45