长期投入指针

时间:2011-11-09 16:51:43

标签: c

这次演员会失败吗?

long x=-1;
long y = (long)(void*)x;
assert(x==y);

更具体地说,如何在编译时检测上面的演员是否正常。

4 个答案:

答案 0 :(得分:7)

更便携的方式(在C99标准变体上)是#include <stdint.h>,然后将指针转换为intptr_t(并返回)。这个整数类型保证是指针的大小。

答案 1 :(得分:2)

可携带没有。 我甚至知道这会失败的实现。 x86实模式,内存模型微小,中小。 long是32位,指针是16位。 其他采用哈佛架构的微控制器也可能会失败。

答案 2 :(得分:0)

据我记得,这不会失败,因为你将y的类型更正为(long)(void*)

答案 3 :(得分:-1)

对于long int和指针大小不同的体系结构,这可能会失败。一些64位架构具有这种行为。像Basile所说的那样,如果您的系统可用,请使用intptr_t。

您可以在编译时检测到这种情况,如下所示:

#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
STATIC_ASSERT((sizeof(void*) > sizeof(long)), incompatible_pointer_size);