我刚注意到gcc和clang似乎都对stdint.h使用typedef,而对stdbool.h使用#define。
#ifdef __INT8_TYPE__
#ifndef __int8_t_defined /* glibc sys/types.h also defines int8_t*/
typedef __INT8_TYPE__ int8_t;
#endif /* __int8_t_defined */
typedef __UINT8_TYPE__ uint8_t;
# define __int_least8_t int8_t
# define __uint_least8_t uint8_t
#endif /* __INT8_TYPE__ */
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Define _Bool, bool, false, true as a GNU extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
#endif
为什么不是typedef _Bool bool;
?
答案 0 :(得分:19)
stdbool.h
将bool
定义为宏,因为C标准(section 7.18)表示bool
应定义为宏,stdint.h
定义{{ 1}}等作为typedef,因为C标准(section 7.20)表示intN_t
等应定义为typedef。
好的,为什么C标准说这些东西?我无法肯定地告诉你,但有一条线索在第7.18节第4段:
尽管有7.1.3的规定,但程序可能会取消定义,然后重新定义宏bool,true和false。
如果intN_t
是typedef且bool
和true
是,我不知道,false
常量,他们不能允许你这样做,因为有无法撤消这些声明。
好的,为什么C委员会想要允许你这样做?这更具推测性,但可能出于同样的原因,他们添加了enum
和stdbool.h
,而不是制作_Bool
,bool
和true
个关键字在C ++中:他们希望保持与自定义false
,bool
和true
的旧程序的兼容性,即使这些程序使用包含false
的第三方标头。 ..
此类向后兼容性问题不适用于stdbool.h
定义的类型;一些系统提供(一些)作为扩展,但它们总是typedef。
答案 1 :(得分:1)