这次演员会失败吗?
long x=-1;
long y = (long)(void*)x;
assert(x==y);
更具体地说,如何在编译时检测上面的演员是否正常。
答案 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);