有没有一种可靠的方法来声明整数类型的固定8,16,32类型定义,和64位长度的ISO标准C?
当我说ISO标准C,我的意思是严格:
- ISO C89 / C90,C99没有。
- 无头不是在ISO标准中定义。
- 没有预处理器符号未在ISO标准中定义。
- 无类型大小假设在ISO标准没有规定。
- 没有专有供应商的符号。
我看到在StackOverflow上类似于此的其他问题,但没有解答不违反上述制约因素之一。 我不知道这是可能的,而不诉诸平台符号。
有没有一种可靠的方法来声明整数类型的固定8,16,32类型定义,和64位长度的ISO标准C?
当我说ISO标准C,我的意思是严格:
我看到在StackOverflow上类似于此的其他问题,但没有解答不违反上述制约因素之一。 我不知道这是可能的,而不诉诸平台符号。
是的 ,你可以。
头文件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
严格地说,ISO 9899:1999所取代ISO 9899:1990等是目前唯一的ISO标准C语言规范。
至于整型确切的宽度typedef名称只引入在1999年版的标准,仅使用1990年版标准你想要什么是不可能的。
空无一人。 有大小申报个人整型变量高达32位的可靠方法,但是,如果你愿意忍受一些限制。 只要使用long
位字段(后者是保证至少32位宽,和你被允许最多使用尽可能多的位的位域能填满的变量,如果省略位域声明符)。 所以:
struct {
unsigned long foo : 32;
} bar;
很显然,你得到所有附带的限制,如不能有指向这些变量。 为签署本真的给你买了只对无符号类型担保超过/下溢在指定的边界环绕,而且当时唯一的事情,因为溢出是不确定的。
除此之外,还有纯C90做到这一点没有可移植的方法。 除其他事项外,一个符合的C90实现甚至不需要有8位整数,例如-这将是完全合法的,有一个平台,其中sizeof(char) == sizeof(short) == sizeof(int) == 1
和CHAR_BIT == 16
(即,它具有一个16位的字机,并且不能处理个别字节)。 我听说做其实存在于实践中的一些DSP的形式这样的平台。
不,你不能这样做。
现在,如果你想指望像牛羚多级配置过程中configure
的解决方案,你能做到这一点,并坚持C89。 当然也有,你可以使用在 C89多种类型,而几乎今天这周围的每一个执行DTRT,所以你得到你想要的大小,并用纯符合的C89坚持。 但是位宽,而你想要什么,一般不会由标准指定。
用这样的方法甲危险使用现代编译时是它已成为时尚用于编译器的假设,一个整数类型的指针将不被用于访问的另一个值, 即使当两种类型的具有相同的尺寸和表示 。 如果两种类型具有相同的大小和代表性,以及相同程序的两个部分,每个部分选择其中之一,将链接时优化到共享指针这样的数据可能导致不当行为的程序。 对于在许多系统一些实施方式中,将有整数为此就不可能声明可以安全地用于访问该尺寸的所有整数值的指针的至少一个尺寸; 例如在其中两个系统long
和long long
是64位,就没有方法来声明其可以可靠地使用的任可互换类型的访问数据的指针。