Provided by: manpages-ru_4.21.0-2_all 

ИМЯ
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