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