在这个答案和附带的评论中,Pavel Minaev提出以下论点:在C中,uint8_t可以使用typedef 的唯一类型是char和unsigned char.我正在看这个 C标准草案.
uint8_t意味着存在相应的类型int8_t(7.18.1p1).int8_t 是8位宽,没有填充位(7.18.1.1p1).uint8_t也是8位宽.unsigned char是CHAR_BIT位宽(5.2.4.2.1p2和6.2.6.1p3).CHAR_BIT 至少是8(5.2.4.2.1p1).CHAR_BIT最多为8,因为它们uint8_t是unsigned char,或者它unsigned char是非位域类型,其宽度是CHAR_BIT(6.2.6.1p4)的倍数.根据这个论点,我同意,如果uint8_t存在,那么它和它unsigned char具有相同的表示:8个值位和0个填充位.这似乎并不强迫它们成为同一类型(例如,6.2.5p14).
是否允许对uint8_t具有相同表示的扩展无符号整数类型(6.2.5p6)进行typedef unsigned char?当然它必须是typedef'd(7.18.1.1p2),并且它不能是除unsigned char(或者char它恰好是无符号)之外的任何标准无符号整数类型.这个假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象的别名访问,这让我觉得编译器编写者想要这样做的原因事情.