c89 标准要求实现提供哪些硬件特定定义?

What hardware specific defines does the c89 standard require the implementation to provide?

c(89) 标准是否指定了必须由实现定义的某些硬件属性?例如,在我的 Linux 系统上有一个 __WORDSIZE 的定义(定义为 64)——我可以期望 __WORDSIZE 在每个符合 c(89) 的系统上定义吗? c 标准是否需要实现提供其他硬件特定值?

我想到

CHAR_BIT(请参阅 C11 标准草案的 5.2.4.2.1/1)。

它定义了非位域的最小整数的宽度(位数)。在最近的系统上,这通常是 8。

不过,这是否一定要被视为硬件属性还有待商榷。

C 试图抽象硬件属性。这可能是它传播的(主要?)原因。

C89 指定由 limits.hsee here for the freely accessible draft text.

提供的限制

正如 alk 已经 评论的那样,唯一真正 特定于硬件 的是 CHAR_BIT,其他的是特定于实现的。

至于__WORDSIZE,这不是标准定义,字长应该是多少值得怀疑。

您始终可以使用巧妙的宏来确定类型中的位数,例如 in this answer,在此处引用它:

/* Number of bits in inttype_MAX, or in any (1<<b)-1 where 0 <= b < 3E+10 */
#define IMAX_BITS(m) ((m) /((m)%0x3fffffffL+1) /0x3fffffffL %0x3fffffffL *30 \
                  + (m)%0x3fffffffL /((m)%31+1)/31%31*5 + 4-12/((m)%31+3))

有了这个,您可以像这样确定 unsigned int 的大小(以位为单位):

IMAX_BITS((unsigned)-1)

但这真的是字号吗?在 x86_64 上,结果将为 32,而指针为 64 位。

使用 C99 及更高版本,您可以改为使用

IMAX_BITS((uintptr_t)-1)

但请注意,uintptr_t 只需要能够容纳一个指针——它 可以 更大。