ОК, после еще одного исследования я, наконец, пришел к выводу, что, в первую очередь, включая заголовок C ++, позднее - заголовок C.
Например, рассмотрим следующий заголовок C ++ 0x (из gcc):
/ USR / включать / C ++ / 4,3 / tr1_impl / cstdint:
// ...
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
#include_next <stdint.h>
// ...
Что он делает, так это то, что он определяет два макроса C99 и только потом включает заголовок C99 stdint.h. Причина в том, что в C99 некоторые функции stdint.h являются необязательными и доступны только в том случае, если эти макросы определены. Однако в C ++ 0x все функции stdint.h являются обязательными.
Теперь, если бы я сначала включил C99 stdint.h, а затем cstdint, я бы не получил обязательных функций C ++ 0x из-за защиты заголовков в stdint.h.
Можно утверждать, что это вина производителя компилятора, но это было бы неправильно. stdint.h - системный заголовок (в данном случае от glibc), который является заголовком C99 и ничего не знает о C ++ 0x (в конце концов, это может быть старая система) или gcc. Компилятор не может действительно исправить все системные заголовки (в этом случае всегда включать эти функции в режиме C ++), однако он должен обеспечить поддержку C ++ 0x в этих системах, поэтому поставщик использует этот обходной путь вместо этого.