首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指针上的操作类型是什么

指针上的操作类型是什么
EN

Stack Overflow用户
提问于 2011-03-27 21:08:30
回答 2查看 255关注 0票数 4

我已经搜索了相当多,但找不到任何有用的东西-但我不确定我正在搜索的是正确的东西。

有没有标准定义的标量必须至少和指针一样大?即sizeof(?) >= sizeof(void*)。

我之所以需要它,是因为我正在编写一个小的垃圾收集器,并且想要一些类似以下内容的东西:

代码语言:javascript
运行
复制
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似乎是正确的标准。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。)

票数 4
EN

Stack Overflow用户

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5449404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档