我已经搜索了相当多,但找不到任何有用的东西-但我不确定我正在搜索的是正确的东西。
有没有标准定义的标量必须至少和指针一样大?即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似乎是正确的标准。
发布于 2011-03-27 21:16:31
您可以包含<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。)
发布于 2011-03-27 21:22:21
C99在<stdint.h>
中有一个可选的uintptr_t
,它保证您可以在uintptr_t和指针值之间进行转换,尽管它没有说明任何关于整数的操作。
通常,在普通平台上,void*与任何其他指针相同,将指针转换为整数,操作该整数并将其转换回指针会产生定义良好的结果,但C不能保证这一点,因此您必须知道您要针对的编译器/平台。
如果你有一个C99编译器,最好的办法就是使用上面提到的uintptr_t,或者在目标平台上编译一个程序,检查sizeof(void*)是否等于unsigned short,int,long,long long中的任何一个,并生成一个头文件,根据程序发现的内容在其中定义你自己的uintptr。
https://stackoverflow.com/questions/5449404
复制相似问题