Знание этих макросов необходимо, так как набор макросов, определенных по умолчанию, не обеспечивает полную функциональность glibc
. Некоторые механизмы, описанные в этой книге, в выбранном по умолчанию наборе функций не доступны; далее мы опишем макросы, необходимые для включения каждого такого механизма.
Макросы проверки возможностей разработаны для определения стандартов (glibc
. Это соглашение часто не включает определения функций и макросов, не указанных стандартом, в стандартных заголовочных файлах. Это значит, что приложение, написанное в соответствии со стандартом, может определять свои собственные функции и макросы, не конфликтуя с расширениями, которые этим стандартом не определены.
Макросы проверки возможностей не гарантируют того, что приложение будет полностью совместимо со стандартами, определяемыми набором макросов. Настройка макроса проверки возможности может обнаружить использование непереносимых расширений, но при этом не будет обнаружено использование, скажем, заголовочных файлов, которые полностью не определены стандартом.
Макросы определяются в системном заголовочном файле feature.h
, который не должен включаться непосредственно. Взамен его включают все другие заголовочные файлы, которые зависят от содержимого feature.h
.
Набор макросов по умолчанию содержит _SVID_SOURCE=1
, _BSD_SOURCE=1
, _POSIX_SOURCE=1
и _POSIX_C_SOURCE=199506L
. Описание каждой из этих опций можно найти ниже, но все это, по сути, транслируется в поддержку возможностей стандарта 1995 POSIX (этот стандарт использовался до объединения стандартов POSIX и Single Unix), всех стандартных функций System V и всех функций BSD, которые не конфликтуют с функциями System V. Данного набора макросов достаточно для большинства программ.
При определении в gcc
опции -ansi
, как было описано ранее, автоматически определяется внутренний макрос __STRICT_ANSI__
, который отключает все макросы, определенные по умолчанию.
За исключением __STRICT_ANSI__
, который представляет собой специальный макрос (и должен настраиваться только компилятором в контексте опции командной строки -ansi
), эти макросы имеют накопительный характер, то есть можно определять любые их комбинации. Точное определение изменений _BSD_SOURCE
зависит от настройки других макросов (более детально об этом — ниже); все остальные
макросы — исключительно накопительные.
Некоторые макросы определяются различными версиями POSIX или других стандартов, другие являются общими, а третьи могут использоваться только в glibc
.