2016-05-09 14 views
1

Я прочитал в C99 standard, что stdint.h является частью стандартной библиотеки C.stdint.h и C99

Правильно ли я прочитал, что, если я проверить на соответствие C99, используя:

defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 

, что означает stdint.h должен быть доступен?

Возможный случай: могу ли я рассмотреть среду, которая претендует на то, что она соответствует требованиям C99, но не предусматривает stdint.h, чтобы быть в противоречии с ее собственным заявлением о соответствии, следовательно, ошибкой?

Редактировать: для любознательных, рассматриваемая система является OpenVMS с HP C Compiler (не ССАГПЗ, который на OpenVMS не предусматривает stdint.h). Поэтому в соответствии с ответами и комментариями, полученными до сих пор, я должен рассматривать эту реализацию (которая претендует на роль C99) как багги. Для получения более подробной информации: https://groups.google.com/forum/#!topic/comp.os.vms/Bnh3tIOc7bo%5B101-125%5D

+0

Это не очень надежный. Solaris 7, например, предоставляет 'inttypes', но не' stdint'. Я бы отказался от любых специальных определений и просто использовал ['autoconf'] (https://www.gnu.org/software/autoconf/autoconf.html) –

+1

@ user6292850: Вы говорите, что Solaris 7 (выпущен в 1998 году) заявила C99, определяя '__STDC_VERSION__' значение не менее $ 199901L? – rici

+0

@rici Учитывая, что [inttypes] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/inttypes.h.html) требует 'stdint.h', по определению ... –

ответ

5

Да.

Кстати, неопределенные символы расширения для 0 в препроцессоре, так что вы могли бы просто написать:

#if __STDC_VERSION__ >= 199901L 

С другой стороны, реализация, которая не требования, чтобы соответствовать C99 (или C11) может по-прежнему поддерживать <stdint.h> в качестве расширения.

+0

Это зависит от флагов компиляции. Некоторое предупреждение просто не любит неопределенные макросы и запускается (см. Gcc '-Wundef'). – Cyan

+0

@Cyan Вам нужно будет явно включить его, так как он не включен '-Wall -Wextra -pedantic'. Кроме того, определение выполняется только при компиляции в режиме '-ansi'. Но опять же, если вы обеспокоены соблюдением стандартов при компиляции в режиме C99, 'autoconf' является единственным переносным способом тестирования функций. –

+1

@Cyan: вопрос не задал gcc. Любая реализация, совместимая с C99 (или совместимая с C11), должна обеспечивать «». –

2

stdint.h является одним из немногих заголовков, что любой, соответствующий реализации, вынужден реализовать. Даже различные непонятные встроенные системные компиляторы имеют. См. Нормативный текст C11 глава 4/6:

Соответствующая принимающая реализация должна принять любую строго соответствующую программу. Соответствующая реализация должна принять любую строго соответствующую программу, в которой использование функций, указанных в разделе библиотеки (раздел 7), ограничивается содержимым стандартных заголовков <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, и <stdnoreturn.h>.

Итак, вы можете протестировать для __STDC_VERSION__ >= 199901L, и тогда заголовок должен быть доступен. Обратите внимание, что такого требования нет для inttypes.h.

В данном случае я могу рассмотреть среду, которая претендует на совместимость с C99, но не предоставляет stdint.h, чтобы быть в противоречии с ее собственным утверждением соответствия (и, следовательно, ошибкой)?

Да.