Заголовки C: специфичные для компилятора или специфичные для библиотеки?

Есть ли четкое различие между стандартными файлами заголовков C *.h, предоставляемыми компилятором C, и теми, которые предоставляются стандартной библиотекой C? Есть ли какой-то список или какие-то стандартные места?

Мотивация: int этот ответ Я получил некоторое время назад, относительно отсутствующего unistd.h в последнем компиляторе TinyC, автор утверждал, что unistd.h (в отличие от sys/unistd.h) не должен быть предоставлен компилятором, но вашей библиотекой C.

Я не мог понять этот ответ (во-первых, разве это не должно относиться, скажем, к stdio.h?), но я все еще думаю об этом. Это правильно? Где какая-то авторитетная ссылка на это?

Глядя на другие компиляторы, я вижу, что другие "автономные" компиляторы POSIX C, размещенные в Windows (например, инструментальная цепочка GCC, которая поставляется с MinGW в нескольких воплощениях; или компилятор Digital Mars), включают все файлы заголовков.

И в стандартном дистрибутиве Linux (скажем, Centos 5.10) я вижу, что пакет gcc предоставляет несколько файлов заголовков (например, stdbool.h, syslimits.h) в /usr/lib/gcc/i386-redhat-linux/4.1.1/include/, а пакет glibc-headers предоставляет большинство заголовков в /usr/include/ (включая stdio.h, /usr/include/unistd.h и /usr/include/sys/unistd.h).

Так что ни в том, ни в другом случае я не вижу поддержки вышеуказанному утверждению.


person leonbloy    schedule 12.06.2014    source источник


Ответы (2)


Нет, четкого разграничения нет.

Что касается стандарта C (вот недавний проект), компилятор и библиотека вместе составляют реализацию, которая в основном описана в разделах 6 и 7 стандарта соответственно.

Для некоторых реализаций компилятор и библиотека времени выполнения предоставляются одним и тем же поставщиком/организацией/лицом либо в виде одного устанавливаемого пакета, либо в виде двух отдельных пакетов. Для других реализаций (включая gcc) большая часть стандартной библиотеки предоставляется базовой операционной системой, но установочный пакет для компилятора включает несколько собственных заголовков.

Другой пример: когда вы устанавливаете gcc из исходного кода в Solaris, программа установки запускает сценарий, который захватывает копии некоторых существующих файлов заголовков (предоставленных библиотекой времени выполнения Sun Oracle) и редактирует их, устанавливая измененные копии. в отдельный каталог.

В системах GNU/Linux компилятором C по умолчанию обычно является gcc, а библиотека времени выполнения предоставляется glibc — оба пакета GNU, но разработанные отдельно. Реализация MinGW под Windows использует компилятор gcc с библиотекой времени выполнения Microsoft (что приводит к некоторым проблемам, поскольку они расходятся в представлении long double).

Выбор того, какие стандартные заголовки должны быть предоставлены компилятором, делают авторы компилятора. Заголовки, реализация которых тесно связана с конкретным компилятором (например, <stdint.h>, <limits.h> и <float.h>), обычно предоставляются компилятором; заголовки, которые обеспечивают интерфейс для служб операционной системы, таких как <stdio.h> и <stdlib.h>, обычно предоставляются библиотекой времени выполнения или, возможно, ОС.

Стандарт C не дает прямых указаний относительно того, как следует делать этот выбор.

person Keith Thompson    schedule 12.06.2014
comment
Спасибо. Есть ли у вас какое-либо мнение о связанном утверждении, о различии unistd.h и sys/unistd.h? - person leonbloy; 12.06.2014

За исключением встроенных (автономных) реализаций C, нет особого смысла разделять C на компилятор и библиотеки. Ни компилятор без библиотек, ни библиотека C без компилятора не имеют большого смысла. Только компилятор вместе с библиотекой составляют полную реализацию.

Начиная с C89, стандартная библиотека является частью стандарта C, и список необходимых файлов заголовков указан в стандарте. Другие наборы библиотек стандартизированы Posix, X/Open... Список см. в этом ответе: Список стандартных заголовочных файлов в C и C++

Есть некоторые заголовки, которые по своей природе ближе к самому компилятору, например. limits.h, который определяет размер типов данных. Некоторые заголовки ближе к ОС, например unistd.h. Однако в обоих случаях есть пересечения, и если представление ОС о, скажем, size_t и реализация компилятора не согласуются, ничего не получится.

Можно также утверждать, что unistd.h должна предоставляться ОС, а не библиотекой C - в конце концов, знание того, как вызывать функцию ядра, принадлежит ОС.

Подводя итог, я думаю, что это различие между компилятором, библиотекой C и операционной системой не имеет большого смысла.

person Chris    schedule 12.06.2014
comment
«Ни компилятор без библиотек [...] не имеет особого смысла». Есть автономные реализации, конечно есть смысл. - person mafso; 12.06.2014
comment
@mafso Я знаю об этом, но я думаю, что автор вопроса имел в виду реализацию. В автономном режиме компилятор в основном содержит свою собственную библиотеку, что, по IMO, также указывает на то, что аргумент разделения ошибочен. - person Chris; 12.06.2014
comment
OP явно просил реализацию без стандартной библиотеки, которая является автономной. Вопрос заключался в том, должен ли <unistd.h> быть частью такой автономной реализации, а C11 §6.1 требует только заголовков <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, <stdnoreturn.h> для такой реализации. - person mafso; 12.06.2014
comment
@mafso: ОП ничего не сказал об автономных реализациях. Для многих размещенных реализаций компилятор и библиотека (которые вместе составляют реализацию) предоставляются отдельно. В большинстве систем Linux реализация C состоит из gcc и glibc. Например, в Solaris он может состоять из gcc и библиотеки Solaris. Это означает, что я не согласен с ответом Криса; это различие имеет большое значение, потому что реализация C может быть собрана из разных компонентов. - person Keith Thompson; 13.06.2014
comment
Есть некоторые заголовки (или средства в стандартном языке) -- Стандарт C не использует слово средства в этом смысле. - person Keith Thompson; 13.06.2014
comment
@KeithThompson спасибо - получил это от Harbison & Steele и не проверял в Standard. Отредактированный ответ. - person Chris; 13.06.2014