指针操作的类型

时间:2011-03-27 13:08:30

标签: c++ c pointers

我搜索了很多,但找不到任何有用的东西 - 但后来我不确定我是在寻找合适的东西。

标准定义的标量是否必须至少与指针一样大?即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似乎是这种情况下的正确标准。

2 个答案:

答案 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。