C99中的固定大小的指针类型

用户3120046

我想创建一个存储指针的类型。该类型应与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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于整数大小的转换指针类型(C99)

来自分类Dev

在C99中,布尔类型可以返回什么?

来自分类Dev

指向C99之前运行时确定大小的数组的指针

来自分类Dev

在C99 7.19 / C11 7.21中,“必须是指向字符类型数组的初始元素的指针”是什么意思?

来自分类Dev

_C99的布尔数据类型

来自分类Dev

_C99的布尔数据类型

来自分类Dev

C99和C ++ 03中空指针的定义差异

来自分类Dev

在标准C中(而不是在C99中)在运行时声明数组的大小

来自分类Dev

快速检查C99中函数指针的结构是否为NULL

来自分类Dev

快速检查以查看C99中函数指针的结构是否为NULL

来自分类Dev

在C99中使用和不使用&打印指针之间的区别

来自分类Dev

指向结构内存分配的C(std = c99)指针

来自分类Dev

需要C99中的_Bool吗?

来自分类Dev

C99中的声明符语义

来自分类Dev

C99中的内联,静态,外部

来自分类Dev

在C99中长久

来自分类Dev

需要C99中的_Bool吗?

来自分类Dev

获取C99可变参数函数的参数类型

来自分类Dev

C99警告将空指针分配给非空指针?

来自分类Dev

C99警告将void指针分配给非void指针?

来自分类Dev

指针的大小,C中的指针

来自分类Dev

C99预处理器中的static_if

来自分类Dev

free函数的隐式声明在c99中无效

来自分类常见问题

c99中的func()vs func(void)

来自分类Dev

C99中“算术运算”的定义是什么?

来自分类Dev

函数“ DLog”的隐式声明在C99中无效

来自分类Dev

在C99中获取右值的地址

来自分类Dev

在C99中的结构内强制枚举值的宽度

来自分类Dev

c99中不赞成使用getresuid吗?