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

时间:2017-07-10 10:42:09

标签: c standards c89

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

2 个答案:

答案 0 :(得分:4)

CHAR_BIT出现在我的脑海中(见C11标准草案的5.2.4.2.1 / 1)。

它定义不是位字段的最小整数的宽度(位数)。在最近的系统中,这通常是8。

但是,这是否必须被视为硬件属性是有争议的。

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

答案 1 :(得分:4)

C89指定limits.hsee here for the freely accessible draft text提供的限制。

alk answered by 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只需要能够持有一个指针 - 可以更大。