Provided by: manpages-ru_4.21.0-2_all bug

ИМЯ

       feature_test_macros - макросы тестирования свойств

ОПИСАНИЕ

       Макросы  тестирования  свойств  позволяют программисту контролировать какие определения будут доступны из
       системных заголовочных файлов при компиляции программы.

       ЗАМЕЧАНИЕ: В целях эффективности, макрос тестирования свойств должен быть  определён  до  включения  всех
       заголовочных  файлов.  Это  можно  сделать  или в команде компиляции (cc -DМАКРОС=значение) или определив
       макрос в исходном коде до включения заголовочных файлов. Требование включения  макроса  раньше  остальных
       заголовочных  файлов  возникло  из-за  того, что заголовочные файлы могут включаться друг в друга в любой
       последовательности. Например, в следующих строках определение макроса _GNU_SOURCE может не сработать, так
       как заголовок <abc.h> сам включает <xyz.h> (в POSIX это разрешается явным образом):

           #include <abc.h>
           #define _GNU_SOURCE
           #include <xyz.h>

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

       Действие  каждого  макроса  тестирования  свойств,  описанного  далее,  можно   узнать   из   содержимого
       заголовочного  файла  <features.h>. Замечание: в приложениях не нужно явно включать <features.h> — это не
       приветствуется. Смотрите ЗАМЕЧАНИЯ.

   Обозначение макросов тестирования свойств в справочных страницах
       Когда функции требуется определение макроса тестирования свойств в ОБЗОРЕ  справочной  страницы,  обычно,
       содержится упоминание в следующем виде (этот пример взят из справочной страницы acct(2)):

              #include <unistd.h>

              int acct(const char *filename);

          Требования макроса тестирования свойств для glibc
          (см. feature_test_macros(7)):

              acct(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

       Символ  ||  означает,  что  для  получения  объявления  acct(2)  из  <unistd.h> нужно определить любой из
       следующих макросов до включения любых заголовочных файлов:

           #define _BSD_SOURCE
           #define _XOPEN_SOURCE        /* или любое значение < 500 */

       Или же эквивалентные определения могут быть включены следующей командой компиляции:

           cc -D_BSD_SOURCE
           cc -D_XOPEN_SOURCE           # или любое значение < 500

       Как описывается далее, некоторые макросы тестирования свойств определяются по умолчанию,  поэтому  макрос
       не всегда нужно указывать явно даже, если он приведён в ОБЗОРЕ.

       В   некоторых  случаях  в  справочных  страницах  используется  сокращённая  запись  требований  макросов
       тестирования свойств (пример из readahead(2)):

           #define _GNU_SOURCE
           #include <fcntl.h>

           ssize_t readahead(int fd, off64_t *offset, size_t count);

       Такой формат употребляется в случаях, когда достаточно одного макроса для получения объявления функции, и
       этот макрос не определён по умолчанию.

   Макросы тестирования свойств, распознаваемые glibc
       The paragraphs below explain how feature test macros are handled in glibc 2.x, x > 0.

       First, though, a summary of a few details for the impatient:

       •  Макросы,  которые  вам,  вероятно,  понадобится  использовать  в  современном  коде:   _POSIX_C_SOURCE
          (определения  из  различных  версий  POSIX.1),  _XOPEN_SOURCE  (определения  из различных версий SUS),
          _GNU_SOURCE (специальные возможности GNU и/или Linux) и _DEFAULT_SOURCE (определения, которые, обычно,
          включены по умолчанию).

       •  Некоторые макросы определяют значения по умолчанию. То есть, хотя один или более макросов  могут  быть
          указаны как необходимые в ОБЗОР справочной страницы, возможно необязательно определять их явно. Полное
          описание значений по умолчанию приведены далее в этой справочной странице.

       •  Определение   _XOPEN_SOURCE   со  значением  600  и  более  даёт  тот  же  эффект  что  и  определение
          _POSIX_C_SOURCE со значением 200112L и больше. Если требуется

              _POSIX_C_SOURCE >= 200112L

          в макросах тестирования свойств ОБЗОРА справочной страницы, то это неявным образом тоже что и:

              _XOPEN_SOURCE >= 600

       •  Определение  _XOPEN_SOURCE  со  значением  700  и  более  даёт  тот  же  эффект  что   и   определение
          _POSIX_C_SOURCE со значением 200809L и больше. Если требуется

              _POSIX_C_SOURCE >= 200809L

          в макросах тестирования свойств ОБЗОРА справочной страницы, то это неявным образом тоже что и:

              _XOPEN_SOURCE >= 700

       glibc understands the following feature test macros:

       __STRICT_ANSI__
              Стандарт  ISO  C. Этот макрос неявно определяется компилятором gcc(1), если он вызывается с флагом
              -std=c99 или -ansi.

       _POSIX_C_SOURCE
              При определении этого макроса из заголовочных файлов становится доступно следующее:

              •  При значении 1 доступны определения, удовлетворяющие POSIX.1-1990 и ISO C (1990).

              •  При значении 2 и более дополнительно доступны определения, удовлетворяющие POSIX.2-1992.

              •  При значении 199309L и  более  дополнительно  доступны  определения,  удовлетворяющие  POSIX.1b
                 (расширения для реального времени).

              •  При  значении  199506L  и  более  дополнительно  доступны определения, удовлетворяющие POSIX.1c
                 (нити).

              •  (начиная с glibc 2.3.3) При значении 200112L  и  более  доступны  определения,  удовлетворяющие
                 базовой спецификации POSIX.1-2001 (за исключением расширения XSI) а также свойства C95 (начиная
                 с  glibc  2.12)  и  C99  (начиная  с  glibc  2.10).  Другими словами это эквивалент определения
                 _ISOC99_SOURCE.

              •  (начиная с glibc 2.10) При значении  200809L  и  более  доступны  определения,  удовлетворяющие
                 базовой спецификации POSIX.1-2008 (за исключением расширения XSI).

       _POSIX_SOURCE
              Определение  этого  устаревшего макроса с любым значением эквивалентно определению _POSIX_C_SOURCE
              со значением 1.

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

       _XOPEN_SOURCE
              При определении этого макроса из заголовочных файлов становится доступно следующее:

              •  Определение  с любым значением делает доступным определения, удовлетворяющие POSIX.1, POSIX.2 и
                 XPG4.

              •  При значении 500 и более дополнительно доступны определения, удовлетворяющие SUSv2 (UNIX 98).

              •  (начиная  с  glibc  2.2)  При  значении  600L  и  более  дополнительно  доступны   определения,
                 удовлетворяющие  SUSv3 (UNIX 03; т. е., базовой спецификации POSIX.1-2001 плюс расширение XSI),
                 и определения C99.

              •  (начиная  с  glibc  2.10)  При  значении  700  и  более  дополнительно  доступны   определения,
                 удовлетворяющие SUSv4 (т. е., базовой спецификации POSIX.1-2008 плюс расширение XSI).

              If  __STRICT_ANSI__ не определено или определено _XOPEN_SOURCE со значением больше или равно 500 и
              явно не определено _POSIX_SOURCE или _POSIX_C_SOURCE, то неявно определяются следующие макросы:

              •  _POSIX_SOURCE определяется со значением 1.

              •  _POSIX_C_SOURCE определяется согласно значению _XOPEN_SOURCE:

                 _XOPEN_SOURCE < 500
                        _POSIX_C_SOURCE определяется со значением 2.

                 500 <= _XOPEN_SOURCE < 600
                        _POSIX_C_SOURCE определяется со значением 199506L.

                 600 <= _XOPEN_SOURCE < 700
                        _POSIX_C_SOURCE определяется со значением 200112L.

                 700 <= _XOPEN_SOURCE (начиная с glibc 2.10)
                        _POSIX_C_SOURCE определяется со значением 200809L.

              Также, определение _XOPEN_SOURCE со значением 500 и более даёт тот же  эффект  что  и  определение
              _XOPEN_SOURCE_EXTENDED.

       _XOPEN_SOURCE_EXTENDED
              Если  этот  макрос  определён  вместе  с  _XOPEN_SOURCE,  то доступны определения, соответствующие
              расширениям UNIX (UNIX 95) XPG4v2 (SUSv1). Определение _XOPEN_SOURCE  со  значением  500  и  более
              также  вызывает  эффект,  подобный  _XOPEN_SOURCE_EXTENDED. Использование _XOPEN_SOURCE_EXTENDED в
              новом коде следует избегать.

              Так  как  определение  _XOPEN_SOURCE  со  значением  500  и  более  даёт  тот  же  эффект,  что  и
              _XOPEN_SOURCE_EXTENDED, последний (устаревший) макрос тестирования свойств, обычно, не описывается
              в ОБЗОРЕ справочной страницы.

       _ISOC99_SOURCE (начиная с glibc 2.1.3)
              Делает доступными объявления, удовлетворяющие требованиям стандарта ISO C99.

              Ранние  версии glibc 2.1.x распознавали макрос-эквивалент _ISOC9X_SOURCE (так как стандарт C99 ещё
              не был утверждён). Хотя использование последнего макроса не рекомендуется, glibc пока поддерживает
              его для обратной совместимости.

              Делает доступными определения стандарта ISO C (1990) Amendment 1 («C95»).  Основным  изменением  в
              C95 была поддержка международных наборов символов.

              Вызов компилятора C с параметром -std=c99 работает также как если был бы указан этот макрос.

       _ISOC11_SOURCE (начиная с glibc 2.16)
              Делает  доступными  объявления,  удовлетворяющие  требованиям стандарта ISO C11. Определение этого
              макроса также включает свойства C99 и C95 (подобно _ISOC99_SOURCE).

              Вызов компилятора C с параметром -std=c11 работает также как если был бы указан этот макрос.

       _LARGEFILE64_SOURCE
              Делает доступными объявления альтернативного программного интерфейса, определяемого в  LFS  (Large