我搜索了很多,但找不到任何有用的东西 - 但后来我不确定我是在寻找合适的东西。
标准定义的标量是否必须至少与指针一样大?即sizeof(?)> = sizeof(void *)。
我需要它,因为我正在写一个小型垃圾收集器,并且想要一些类似的东西:
struct Tag {
uint32_t desc:sizeof(uint32_t)*8-2; // pointer to typedescriptor
uint32_t free:1;
uint32_t mark:1;
};
我更喜欢根据标准有效的东西(如果我们在这里,我很惊讶sizeof(uint32_t)* 8-2对于位域定义有效 - 但是VS2010允许它)。
size_t是否满足此要求?
编辑:所以在我包含C和C ++导致一些问题之后(我认为它们在这方面会相似),我实际上已经解决了其中一个问题(我真的不需要C ++对于这部分代码,我可以将C和c ++链接在一起,这样就可以了。从答案来看,C99似乎是这种情况下的正确标准。
答案 0 :(得分:4)
您可以加入<stdint.h>
(或<cstdint>
)并使用uintptr_t
or intptr_t
。
由于MSVC拒绝支持C99,您可能需要包含<Windows.h>
并使用ULONG_PTR or LONG_PTR代替。 (见C99 stdint.h header and MS Visual Studio)
(另外,请使用CHAR_BIT代替8。)
答案 1 :(得分:1)
C99在uintptr_t
中有可选的<stdint.h>
,它保证你可以在uintptr_t和指针值之间进行转换,尽管它没有说明任何关于整数的操作。
通常,在常见平台上,void *与任何其他指针相同,并将指针转换为整数,操纵该整数并将其转换回指针会产生明确定义的结果,但C不能保证这一点,所以你'我必须知道你想要的编译器/平台。
如果你有一个C99编译器,最好你可以做的就是使用上面提到的uintptr_t,或者在目标平台上编译一个程序来检查sizeof(void *)是否等于任何sizeof unsigned short,int,long ,long long并生成一个头文件,根据程序找到的内容输入你自己的uintptr。