长期投入指针

这个演员会失败吗?

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);