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

kbl*_*uck 5 c standards portability iso

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

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

  • ISO C89/C90,而不是C99.
  • 没有在ISO标准中定义的标头.
  • 没有在ISO标准中定义的预处理器符号.
  • ISO标准中未指定类型大小的假设.
  • 没有专有供应商符号.

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

Vil*_*iam 8

是的,你可以.

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

例:

#include <limits.h>

#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
Run Code Online (Sandbox Code Playgroud)

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

CB *_*ley 7

严格来说,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中得到支持. (2认同)
  • @Pavel:`inttypes.h` _is_是C99标准库的一部分(第7.8节) (2认同)