Почему мой stdbool.h не входит в / usr / include?

Я использую стандартные файлы заголовков C, находящиеся в /usr/include (например, stdio.h , stdlib.h , string.h , ctype.h и т. Д.); пока – stdbool.h нет. Теперь я знаю, что он новее, чем остальные, только будучи частью C99. Но – у меня это есть, это просто на

 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdbool.h /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdbool.h /usr/lib/gcc/x86_64-linux-gnu/5/include/stdbool.h 

другое место для каждой версии GCC. Почему это? Это, в конце концов, стандарт – он не должен изменяться с одной версии GCC на другой. И, конечно же, между версиями нет реальных различий. (*) Почему этот компилятор специфичен, а другие – в системе?

* – Ну, уведомление об авторских правах и некоторый ifdef на основе версии CPLUSPLUS, когда он используется с C ++.

2 Solutions collect form web for “Почему мой stdbool.h не входит в / usr / include?”

Это, в конце концов, стандарт – он не должен изменяться с одной версии GCC на другой.

Нет, это не стандарт. Стандарт заключается в том, что вы можете написать

  #include <stdbool.h> 

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

Весь смысл таких стандартных заголовков заключается в том, что они делают все, что подходит компилятору C / C ++, чтобы обеспечить то, что, по словам языковых стандартов, они должны предоставить при их включении. Они предоставляют требуемые декларации и макросы (обычно) с использованием внутренних ключевых слов, прагм, макросов и встроенных средств, предоставляемых компилятором. Это, конечно, варьируется от компилятора к компилятору.

Которая является второй ошибкой, которую вы здесь делаете. Ошибочно предположить, что GCC является единственным компилятором C / C ++. Люди со старыми фонами программирования DOS или Win32, где может быть много компиляторов, будут очень хорошо знакомы с идеей, что стандартные заголовки очень привязаны к компилятору . Нельзя просто использовать стандартные заголовки (скажем) Watcom C / C ++ и использовать их с Borland, Microsoft, IBM или другими компиляторами C / C ++.

Это мысль принять, потому что это верно и для вас . Хотя то, что должно быть сделано в стандартном заголовке для достижения своей цели, может потенциально варьироваться от одной версии GCC к другому, они также могут варьироваться между (скажем) clang и GCC. Операционные системы Unix и Linux не являются монокультурами одного компилятора.

И действительно, вы найдете float.h , limits.h , stdint.h , stddef.h , stdarg.h и несколько других таких стандартных заголовков, которые все находятся в этих местах, специфичных для компилятора. limits.h является особенно грязным делом, потому что это включает в себя как специфические для компилятора знания, так и знания, специфичные для целевой платформы.

дальнейшее чтение

  • «4.1.2 Стандартные заголовки». Обоснование Американского национального стандарта для информационных систем – Язык программирования – C.
  • Бьярне Страуструп (2013). «Стандартные заголовки библиотек». Язык программирования C ++ . 4-е издание. Addison-Wesley. ISBN 9780133522853.
  • Джонатан де Бойн Поллард (2012). Предопределенные макросы в C / C ++, которые расскажут вам, какие функции языка доступны. , Часто задаваемые ответы.

В unix-подобных системах существует различие между компилятором C (обычно gcc) и стандартным libary C (обычно glibc). В отличие от многих других операционных систем стандартная библиотека C на unix-подобных системах также служит основной библиотекой интерфейса OS.

Чтение стандартов C не поможет вам здесь, поскольку они объединяют компилятор и платформу вместе как «реализацию».

Некоторые заголовки «принадлежат» библиотеке C, поскольку они предназначены для предоставления интерфейса функциональности библиотеки C. Эти заголовки устанавливаются библиотекой C и входят в / usr / include.

Другие заголовки «принадлежат» компилятору C, поскольку они описывают функциональность компилятора. Поскольку дистрибутивы обычно поддерживают несколько компиляторов C, они размещаются в местах, специфичных для компилятора.

  • Установка GCC 4.5 на Fedora 16
  • LFS 7.4 глава 6.7: make: gcc: команда не найдена
  • Использовать файлы math.h и ссылок объектов без -lm
  • Как установить GCC 5 на debian jessie 8.1
  • Можно ли компилировать и загружать GNU?
  • Проблемы с компиляцией Python 3.6.0+ в Qubes OS Debian
  • Почему `libc6` зависит от` libgcc1`?
  • Нет dpkg или apt, no make или gcc. Необходимо установить их все
  • Скомпилированный исполняемый файл рассматривается как разделяемая библиотека
  • Кросс-компиляция OpenSSH для Android
  • Ошибки кросс-компиляции с distcc
  • Interesting Posts

    Какую команду следует использовать для перемещения этих конкретных элементов?

    Как ограничить общие ресурсы (память) процесса и его детей

    Система продолжает запрашивать у меня пароль root вместо моего пароля!

    Может ли systemd выполнить некоторую настройку перед разветвлением в качестве пользователя?

    Есть ли способ разместить комментарий в файле, который vim будет обрабатывать, чтобы установить тип файла?

    Межстрочный интервал в чате с использованием pidgin

    Не удается установить Linux Headers (Kali Linux)

    Есть ли дистрибутив Evergreen Linux?

    Сделать Apache доступ к скрытым файлам (Solaris)

    Переименование рабочих областей в интерактивном режиме с помощью DynamicWorkspaces не работает

    Какие символы должны быть экранированы в аргументах командной строки?

    awk – добавить столбец после сопоставления остальных столбцов

    При использовании меньше с параметром -S, он перемещает текст сверху, когда я нажимаю правую клавишу

    Какие команды имеют параметр -h для чтения человеком и как его включить по умолчанию с переменной w / env?

    массовое переименование файлов, не работающих

    Linux и Unix - лучшая ОС в мире.