当前位置:  开发笔记 > 编程语言 > 正文

在标准C中声明固定大小的整数typedef

如何解决《在标准C中声明固定大小的整数typedef》经验,为你挑选了2个好方法。

是否有一种可靠的方法来为ISO标准C中的固定8,16,32和64位长度的整数类型声明typedef?

当我说ISO标准C时,我的意思是:

ISO C89/C90,而不是C99.

没有在ISO标准中定义的标头.

没有在ISO标准中定义的预处理器符号.

ISO标准中未指定类型大小的假设.

没有专有供应商符号.

我在StackOverflow中看到了与此类似的其他问题,但没有答案尚未违反上述约束之一.如果不诉诸平台符号,我不确定是否可行.



1> Viliam..:

是的,你可以.

头文件limits.h应该是C90的一部分.然后,我将通过预处理指令值测试SHRT_MAX,INT_MAX,LONG_MAX,和LLONG_MAX和相应设置的typedef.

例:

#include 

#if SHRT_MAX == 2147483647
typedef unsigned short int uint32_t;
#elif INT_MAX == 2147483647
typedef unsigned int uint32_t;
#elif LONG_MAX == 2147483647
typedef unsigned long uint32_t ;
#elif LLONG_MAX == 2147483647
typedef unsigned long long uint32_t;
#else
#error "Cannot find 32bit integer."
#endif


@Charles:对于无符号整数类型,C保证没有陷阱位.对于`char`,它也保证没有填充.但是,显然,这仍然不够好.
@Charles,为什么你说测试`SHRT_MAX`并且事情会给你一些存储量?它肯定会给你价值的数量,这就是我认为提问者想要的.@Viliam`typedef int uint32_t;`看起来有点奇怪 - 确定你不是指`typedef unsigned int uint32_t;`?

2> CB Bailey..:

严格来说,ISO 9899:1999取代了ISO 9899:1990,因此是目前唯一的ISO标准C语言规范.

由于整数类型的精确宽度typedef名称仅在1999版本的标准中引入,因此仅使用1990版本的标准是不可能的.


`inttypes.h`甚至不在C90中,它是一个Unixish(好吧,POSIX)标题.`stdint.h`是C99的一部分,更重要的是,C++ TR1和C++ 0x,所以至少它将在VC++ 2010中得到支持.
@Pavel:`inttypes.h` _is_是C99标准库的一部分(第7.8节)
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有