2009-06-12 4 views
31

Я вижу это в стандартных библиотеках C++ для своей системы, а также некоторых заголовках в библиотеке, которую я использую.Что означают __STDC_LIMIT_MACROS и __STDC_CONSTANT_MACROS?

Какова семантика этих двух определений? Есть ли хорошая ссылка для #defines, подобного этому, кроме самого источника?

ответ

40

__STDC_LIMIT_MACROS и __STDC_CONSTANT_MACROS являются обходным путем, позволяющим программам на C++ использовать макросы stdint.h, указанные в стандарте C99, которые не входят в стандарт C++. Макросы, такие как UINT8_MAX, INT64_MIN и INT32_C(), могут быть определены уже в приложениях на C++ другими способами. Чтобы позволить пользователю решить, хотят ли они макросы, определенные как C99, многие реализации требуют, чтобы __STDC_LIMIT_MACROS и __STDC_CONSTANT_MACROS были определены до включения stdint.h.

Это не часть стандарта C++, но она была принята более чем одной реализацией.

+1

Это поражает меня как опасный прецедент присвоения имен. Это усложняет жизнь стандартизаторов - им приходится обращать внимание на то, какие реализации сделали с их пространством имен. –

+1

больше не относится к C11 и, таким образом, C++ 11. – malat

-4

Макросы не являются частью стандарта C++ и, вероятно, используются для внутренних целей в реализации на C++. Если вы хотите узнать больше о них, вы должны задать вопрос с atag, который указывает, что это за реализация.

3

В stdint.h под C++ они контролируют, следует ли определять макросы, такие как INT32_MAX или INT32_C(v). Дополнительную информацию см. На странице stdint.h вашей платформы.

1

Вышеупомянутый вопрос исчез. C99 является старым стандартом, поэтому он был явно отменен в стандарте C++ 11, и, как следствие, C11 удалил это правило.

Подробнее там:

Смежные вопросы