Почему мой 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, они размещаются в местах, специфичных для компилятора.

  • make : *** Ошибка 2 make : *** Ошибка 2
  • Как получить GCC 4.7.1 с 64-разрядной поддержкой, установленной для моей учетной записи пользователя, только на Solaris x86
  • Некоторые команды больше не отвечают?
  • Как я могу решить эту ошибку при создании gcc-4.7.2 для LFS?
  • Как gcc обрабатывает разрешения файлов?
  • GCC (toolchain) для Ralink SoC - ELF не найден и синтаксическая ошибка
  • Создание настраиваемой среды разработки
  • Установка GCC на SLES 12
  • Проблемы с установкой gcc-6 в debian jessie
  • Как связать разные (несовместимые) библиотеки во время выполнения в зависимости от программы?
  • Как пакет, такой как ATLAS, знает, какой компилятор fortran использовать?
  • Interesting Posts

    Добавить vi на Busybox, который обрезается

    CentOS Local User не может просматривать каталоги / файлы через FTP-логин

    Windows 7 с двойной загрузкой + виртуализация в Ubuntu 10.04?

    Bash, чтобы получить результат передачи rsync и закрепить его как каталог в исходном каталоге

    Bash 4, расширение и ввод в строчные буквы

    Как получить доступ к элементу массива в оболочке?

    Изменение разрешений для файлов, созданных службой демона докеров

    Сессия SSH приостанавливает средний поток данных; возобновляется с помощью нажатия клавиши

    Как была определена геометрия диска (C / H / S) в таблице разделов флэш-памяти?

    Где моя резервная копия базы данных PostgreSQL сохраняется после запуска pg_dump?

    DSL-соединение не работает в Ubuntu 10.04

    Создание сортировки использует все процессоры CORES

    Как экспортировать хранилище ключей bks на debased 7.9 wheezy

    Замена шаблонов

    Не работает каталог rsync exclude

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