Ответ 1
stdbool.h
определяет bool
как макрос, поскольку стандарт C (раздел 7.18) говорит, что bool
определяется как макрос, и stdint.h
определяет intN_t
и т.д. как typedefs, потому что стандарт C (раздел 7.20) говорит, что intN_t
и т.д. должны быть определены как typedefs.
Хорошо, почему стандарт C говорит об этом? Я не могу вам точно сказать, но в разделе 7.18 параграфа 4 есть ключ:
Несмотря на положения 7.1.3, программа может определить неопределенность и, возможно, затем переопределить макросы bool, true и false.
Если bool
были typedef и true
и false
были, я не знаю, enum
константы, они не могли бы позволить вам сделать это, так как нет возможности отменить эти виды объявлений.
Хорошо, почему комитет C хочет позволить вам сделать это? Это еще более спекулятивно, но, вероятно, по той же причине они добавили stdbool.h
и _Bool
вместо создания ключевых слов bool
, true
и false
, как они есть на С++: они хотели сохранить совместимость со старыми программы, которые сами определяли bool
, true
и false
, даже если эти программы используют сторонние заголовки, которые включают stdbool.h
...
Никакая такая обратная совместимость не относится к типам, определенным stdint.h
; некоторые системы предоставляли (некоторые) из них как расширения, но они всегда были typedefs.