长期投入指针
这个演员会失败吗?
long x=-1; long y = (long)(void*)x; assert(x==y);
更具体地说,如何在编译时检测上面的强制转换是否正常。
一种更便携的方式(在C99标准变体上)是#include
然后将指针转换为intptr_t
(和返回)。 保证此整数类型为指针的大小。
没有。 我甚至知道这会失败的实现。 x86实模式,内存模型微小,中小。 long
为32位,指针为16位。 其他采用哈佛架构的微控制器也可能会失败。
鉴于您将y的类型更正为(long)(void*)
,我记得这不会失败。
对于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);