我想创建一个存储指针的类型。该类型应与C99兼容,并具有64位的固定宽度。我想出了几种选择,但它们似乎都有缺陷:
uint64_t
是不正确的,因为指针和整数之间的转换是实现定义的[ C99 standard 6.3.2.3]。uinptr_t
由于此类型的宽度不是固定的,并且无论如何该类型都是可选的,因此也似乎不在图片之列[7.18.1.4]。 使用诸如
struct {
#ifdef __LP64__
void* ptr;
#else
// if big endian the following two fields need to be flipped
void* ptr;
uint32_t padding;
#endif
} fixed_ptr_type;
也不起作用,因为即使在同一实现中,指针的大小也不固定
我要寻找的类型是否具有与C99兼容的定义?
存储对象指针的最佳类型是void *
。任何对象指针都可以转换void *
并再次转换。
Avoid *
不一定存储函数指针。但是,任何函数指针都可以转换为另一种类型的函数指针,因此您可以将它们存储为任意类型(例如void (*)(void)
)。
我不知道为什么您需要指针类型具有预定的大小,但是您可以使用联合填充它们,并希望结果不会太大:
union fixed_ptr_type {
void *p;
char c[64/CHAR_BIT];
};
assert (CHAR_BIT * sizeof (union fixed_ptr_type) == 64);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句