Макросы запроса функций

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

Оригинал здесь: Feature Test Macros (The GNU C Library)

Если вы компилируете свои программы, используя gcc -ansi, вы получаете только библиотечные функции ISO C, если конечно, вы явно не запрашиваете дополнительные функции, определяя один или несколько специальных макросов. См. Параметры команд GNU CC в руководстве по GNU CC, для получения дополнительной информации о параметрах GCC.

Вы должны определить эти макросы, используя директивы препроцессора #define в самой верхней части ваших файлов исходного кода. Эти директивы должны быть перед любым #include системного заголовочного файла. Лучше всего сделать их самыми первыми в файле, которому предшествуют только комментарии. Вы также можете использовать опцию -D для GCC, но лучше, если вы сделаете так, чтобы исходные файлы сами указывали необходимые значения.

Данная система макросов существует, чтобы позволить библиотекам соответствовать нескольким стандартам. Хотя разные стандарты часто описываются как надмножества друг друга, они, как правило, несовместимы, поскольку для более крупных стандартов требуются функции с именами, которые могут быть зарезервированы в пользовательской программе. Это не просто педантизм - это было реальной проблемой на практике. Например, некоторые не-GNU программы определяют функции с именем getline , которые не имеют ничего общего с getline стандартной библиотеки. Они не будут компилироваться, если без разбора будут включены все функции.

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

Макрос: _POSIX_SOURCE

Если вы определите этот макрос, то будут доступны функциональные возможности стандарта POSIX.1 (стандарт IEEE 1003.1), а также все стандартные возможности ISO C.

Состояние _POSIX_SOURCE не имеет значения при определении макроса _POSIX_C_SOURCE как положительного целого числа.

Макрос: _POSIX_C_SOURCE

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

#define _POSIX_C_SOURCE 1

При таком определении становятся доступными функциональные возможности выпуска 1990 года стандарта POSIX.1 (стандарт IEEE 1003.1-1990).

Если для этого макроса задано значение, большее или равное 2 , то становятся доступными функциональные возможности выпуска 1992 года стандарта POSIX.2 (стандарт IEEE 1003.2-1992).

Если для этого макроса 199309L значение, большее или равное 199309L , то 199309L функциональные возможности выпуска 1993 года стандарта POSIX.1b (стандарт IEEE 1003.1b-1993).

Если для этого макроса 199506L значение, большее или равное 199506L , то 199506L функциональные возможности выпуска 1995 года стандарта POSIX.1c (стандарт IEEE 1003.1c-1995).

Если для этого макроса 200112L значение, большее или равное 200112L , то 200112L функциональные возможности выпуска 2001 года стандарта POSIX (стандарт IEEE 1003.1-2001).

Если для этого макроса 200809L значение, большее или равное 200809L , то 200809L функциональные возможности стандарта POSIX 2008 года (стандарт IEEE 1003.1-2008).

Большие значения для _POSIX_C_SOURCE зарезервированы для будущих расширений. Процесс стандартизации POSIX будет определять эти значения по мере необходимости, и библиотека GNU C должна поддерживать их через некоторое время после их стандартизации. В выпуске POSIX.1 1996 года (ISO / IEC 9945-1: 1996) говорится, что если для _POSIX_C_SOURCE задать значение, большее или равное 199506L , то будут доступны функции из издания 1996 года. Как правило, в библиотеке GNU C исправления стандартов включены при указании базовой версии; например, POSIX.1-2004 всегда будет включен со значением 200112L .

Макрос: _XOPEN_SOURCE Макрос: _XOPEN_SOURCE_EXTENDED

Если вы определяете этот макрос, включаются функции, описанные в Руководстве по переносимости XSI (X/Open System Interfaces). Это расширенный набор функций POSIX.1 и POSIX.2, и фактически _POSIX_SOURCE и _POSIX_C_SOURCE определяются автоматически.

Как объединение всех Unices, функциональность доступна только в BSD и SVID.

Если макрос _XOPEN_SOURCE_EXTENDED также определен, доступна еще больше функциональных возможностей. Дополнительные функции сделают доступными все функции, необходимые для бренда X/Open Unix.

Если макрос _XOPEN_SOURCE имеет значение 500, это включает в себя все описанные функциональные возможности, а также некоторые новые определения из спецификации Single Unix, версия 2 , Значение 600 (соответствующее шестой редакции) включает в себя определения из SUSv3, а использование 700 (седьмая редакция) включает определения из SUSv4.

Макрос: _LARGEFILE_SOURCE

Если этот макрос определен, доступны некоторые дополнительные функции, которые исправляют некоторые недостатки во всех предыдущих стандартах. В частности, fseeko функции fseeko и ftello . Без этих функций разница между ISO C интерфейс ( fseek , ftell ) и низкоуровневый интерфейс POSIX ( lseek ) могут привести к проблемам.

Этот макрос был представлен как часть расширения поддержки больших файлов (LFS).

Макрос: _LARGEFILE64_SOURCE

Если вы определите этот макрос, станет доступен дополнительный набор функций, который включает 32 бит системы использовать файлы размером за пределы обычного ограничения в 2 ГБ. Этот интерфейс недоступен, если система не поддерживает файлы такого большого размера. В системах, где естественный предел размера файла превышает 2 ГБ (т. Е. На 64-битной систем) новые функции идентичны замененным функциям.

Новая функциональность доступна благодаря новому набору типов и функций, которые заменяют существующие. Имена этих новых типов содержат 64 чтобы указать намерение, например, off_t против off64_t и fseeko против fseeko64 . Этот макрос был представлен как часть расширения поддержки больших файлов (LFS). Это переходный интерфейс на период 64 бит смещения обычно не используются (см. _FILE_OFFSET_BITS ).

Макрос: _FILE_OFFSET_BITS

Этот макрос определяет, какой интерфейс файловой системы должен использоваться, заменяя один другим. Принимая во внимание, что _LARGEFILE64_SOURCE составляет 64 бита интерфейс доступен как дополнительный интерфейс, _FILE_OFFSET_BITS позволяет использовать 64-битную _FILE_OFFSET_BITS интерфейс для замены старого интерфейса.

Если _FILE_OFFSET_BITS не определен или если он определен со значением 32 , ничего не меняется. 32 бит используется интерфейс, а типы типа off_t имеют размер 32 бита на 32 бит системы.

Если для макроса задано значение 64 , интерфейс большого файла заменяет старый интерфейс. Т.е. функции недоступны под разными именами (как в _LARGEFILE64_SOURCE ). Вместо этого старые имена функций теперь ссылаются на новые функции, например, вызов fseeko теперь действительно вызывает fseeko64 .

Этот макрос следует выбирать только в том случае, если система предоставляет механизмы для обработки больших файлов. На 64 бит В системах этот макрос не действует, поскольку функции *64 идентичны нормальным функциям.

Этот макрос был представлен как часть расширения поддержки больших файлов (LFS).

Макрос: _ISOC99_SOURCE

Если этот макрос определен, включаются функции из ISO C99. Поскольку эти функции включены по умолчанию, этот макрос в основном важен, когда компилятор использует более раннюю языковую версию.

Макрос: _ISOC11_SOURCE

Если этот макрос определен, включаются расширения ISO C11 для ISO C99.

Макрос: __STDC_WANT_LIB_EXT2__

Если вы зададите для этого макроса значение 1 , функции из ISO / IEC TR 24731-2: 2010 (функции динамического распределения) будут включены. Библиотека GNU C поддерживает только некоторые функции из этого TR.

Макрос: __STDC_WANT_IEC_60559_BFP_EXT__

Если вы определите этот макрос, функции из ISO / IEC TS 18661-1: 2014 (Расширения с плавающей точкой для C: двоичная арифметика с плавающей точкой) будут включены. Библиотека GNU C поддерживает только некоторые функции из этого TS.

Макрос: __STDC_WANT_IEC_60559_FUNCS_EXT__

Если вы определяете этот макрос, функции из ИСО / МЭК TS 18661-4: 2015 (Расширения с плавающей точкой для C: Дополнительные функции) включены. Библиотека GNU C поддерживает только некоторые функции из этого TS.

Макрос: __STDC_WANT_IEC_60559_TYPES_EXT__

Если вы определяете этот макрос, включаются функции из ИСО / МЭК TS 18661-3: 2015 (Расширения с плавающей точкой для C: Interchange и расширенные типы). Библиотека GNU C поддерживает только некоторые функции из этого TS.

Макрос: _GNU_SOURCE

Если вы определите этот макрос, все включено: ISO C89 , ISO C99 , POSIX.1, POSIX.2, BSD, SVID, X / Open, LFS и GNU. В случаях, когда POSIX.1 конфликтует с BSD, определения POSIX имеют приоритет.

Макрос: _DEFAULT_SOURCE

Если вы определите этот макрос, большинство функций будут включены, кроме расширений X / Open, LFS и GNU: эффект состоит в том, чтобы включить функции из редакции POSIX 2008 года, а также некоторые функции BSD и SVID без отдельного макроса тестирования функций для управления их.

Имейте в виду, что параметры компилятора также влияют на включенные функции:

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

Макрос: _ATFILE_SOURCE

Если этот макрос определен, дополнительные *at интерфейсах включены.

Макрос: _FORTIFY_SOURCE

Если для этого макроса задано значение 1 , усиление безопасности добавляется к различным функциям библиотеки. Если задано значение 2 , применяются еще более строгие проверки.

Макрос: _REENTRANT Макрос: _THREAD_SAFE

Эти макросы устарели. Они имеют тот же эффект, что и определение _POSIX_C_SOURCE со значением 199506L .

Некоторые очень старые библиотеки C требовали, чтобы один из этих макросов был определен для базовой функциональности (например, getchar ), чтобы быть потокобезопасным.

Мы рекомендуем использовать _GNU_SOURCE в новых программах. Если вы не укажете опцию -ansi для GCC или другие опции соответствия, такие как -std=c99, и не определите ни один из этих макросов явным образом, эффект будет таким же, как и определение _DEFAULT_SOURCE для 1.

Когда вы определяете макрос тестирования для запроса более широкого набора возможностей, безопаснее дополнительно определять макрос тестирования для подмножества этих функций. Например, если вы определяете _POSIX_C_SOURCE , то определение _POSIX_SOURCE также не имеет никакого эффекта. Аналогично, если вы определяете _GNU_SOURCE , то определение либо _POSIX_SOURCE либо _POSIX_C_SOURCE также не имеет никакого эффекта.

Информация о заголовках представленных ниже доступна здесь: The Open Group Base Specifications Issue 7, 2018 edition

Перечень обязательных заголовочных файлов, определяемых стандартом POSIX

Заг. файл FreeBSD 8.0 Linux 3.2.0 MacOSX 10.6.8 Solaris 10 Описание
<aio.h> X X X X Асинхронный ввод/вывод
<cpio.h> X X X X Архиватор cpio
<dirent.h> X X X X Работа с каталогами
<dlfcn.h> X X X X Динамическое связывание
<fcntl.h> X X X X Управление файлами
<fnmatch.h> X X X X Шаблоны имен файлов
<glob.h> X X X X Шаблоны путей в файловой системе
<grp.h> X X X - Файл групп
<iconv.h> X X X - Преобразование кодировок символов
<langinfo.h> X X X X Константы сведений о языках
<monetary.h> X X X X Типы и функции для финансовых вычислений
<netdb.h> X X X X Операции с распределенной базой системных данных
<nl_types.h> X X X X Каталоги с сообщениями
<poll.h> X X X X Функция poll
<pthread.h> X X X X Потоки
<pwd.h> X X X X Файл паролей
<regex.h> X X X X Регулярные выражения
<sched.h> X X X X Планировщик
<semaphore.h> X X X X Семафоры
<strings.h> X X X X Операции над строками
<tar.h> X X X X Архиватор tar
<termios.h> X X X X Терминальный ввод/вывод
<unistd.h> X X X X Символьные константы
<wordexp.h> X X - X Дополнение слов по шаблону
<arpa/inet.h> X X X X Сеть Интернет
<net/if.h> X X X X Локальные сетевые интерфейсы
<netinet/in.h> X X X X Семейство адресов Интернета
<netinet/tcp.h> X X X X Определения протокола TCP
<sys/mman.h> X X X X Управление памятью
<sys/select.h> X X X X Функция select
<sys/socket.h> X X X X Интерфейс сокетов
<sys/stat.h> X X X X Получение сведений о файлах
<sys/statvfs.h> X X X X Информация о файловой системе
<sys/times.h> X X X X Время работы процесса
<sys/types.h> X X X X Примитивы системных типов данных
<sys/un.h> X X X X Определения, касающиеся сокетов домена UNIX
<sys/utsname.h> X X X X Название системы
<sys/wait.h> X X X X Управление процессами

Заголовочные файлы расширений XSI (X/Open), определяемые стандартом POSIX

Заг. файл FreeBSD 8.0 Linux 3.2.0 MacOSX 10.6.8 Solaris 10 Описание
<fmtmsg.h> X X X X Вывод сообщений в форматированном виде
<ftw.h> X X X X Обход дерева файлов
<libgen.h> X X X X Определения для функций поиска по шаблону
<ndbm.h> X - X X Операции с базой данных (стандарта dbm)
<search.h> X X X X Поиск по таблицам
<syslog.h> X X X X Системное журналирование
<utmpx.h> - X X X Работа с учетными записями пользователей
<sys/ipc.h> X X X X IPC
<sys/msg.h> X X X X Очереди сообщений
<sys/resource.h> X X X X Операции c ресурсами
<sys/sem.h> X X X X Семафоры
<sys/shm.h> X X X X Разделяемая память
<sys/time.h> X X X X Типы данных для хранения времени
<sys/uio.h> X X X X Векторные операции ввода/вывода

Необязательные заголовочные файлы, определяемые стандартом POSIX

Заг. файл FreeBSD 8.0 Linux 3.2.0 MacOSX 10.6.8 Solaris 10 Описание
<mqueue.h> X X X X Очереди сообщений
<spawn.h> X X X X Интерфейс запуска программ в системах реального времени

Необязательные группы интерфейсов POSIX.1 и их коды

Код Обязательные для SUS Символическая константа Описание
ADV _POSIX_ADVISORY_INFO Консультативная информация (р.р.в.*)
CPT _POSIX_CPUTIME Измерение времени работы процесса (р.р.в.)
FSC X _POSIX_FSYNC Синхронизация файлов
IP6 _POSIX_IPV6 Интерфейсы IPv6
ML _POSIX_MEMLOCK Блокировка памяти процесса (р.р.в.)
MLR _POSIX_MEMLOCK_RANGE Блокировка области памяти (р.р.в.)
MON _POSIX_MONOTONIC_CLOCK Монотонные часы (р.р.в.)
MSG _POSIX_MESSAGE_PASSING Передача сообщений (р.р.в.)
MX __STDC_IEC_559__ Дополнение с плавающей запятой, соответствующее IEC 60599
PIO _POSIX_PRIORITIZED_IO Приоритетный ввод/вывод
PS _POSIX_PRIORITY_SCHEDULING Планирование процессов (р.р.в.)
RPI _POSIX_THREAD_ROBUST_PRIO_INHERIT Наследование приоритета надежных мьютексов (р.р.в.)
RPP _POSIX_THREAD_ROBUST_PRIO_PROTECT Защита приоритета надежных мьютексов (р.р.в.)
RS _POSIX_RAW_SOCKETS Низкоуровневые сокеты
SHM _POSIX_SHARED_MEMORY_OBJECTS Объекты разделяемой памяти (р.р.в.)
SIO _POSIX_SYNCHRONIZED_IO Синхронизированный ввод/вывод (р.р.в.)
SPN _POSIX_SPAWN Запуск процессов (р.р.в.)
SS _POSIX_SPORADIC_SERVER Сервер непериодических (спорадических) процессов (р.р.в.)
TCT _POSIX_THREAD_CPUTIME Измерение процессорного времени для потоков (р.р.в.)
TPI _POSIX_THREAD_PRIO_INHERIT Наследование приоритета потока (р.р.в.)
TPP _POSIX_THREAD_PRIO_PROTECT Защита приоритета потока (р.р.в.)
TPS _POSIX_THREAD_PRIORITY_SCHEDULING Планирование выполнения потоков (р.р.в.)
TSA X _POSIX_THREAD_ATTR_STACKADDR Адрес стека потока
TSH X _POSIX_THREAD_PROCESS_SHARED Синхронизация потоков между процессами
TSP _POSIX_THREAD_SPORADIC_SERVER Сервер непериодических (спорадических) потоков (р.р.в.)
TSS X _POSIX_THREAD_ATTR_STACKSIZE Размер стека потока
TYM _POSIX_TYPED_MEMORY_OBJECTS Типизированная память (р.р.в.)
XSI X _XOPEN_UNIX Интерфейсы расширений X/Open

р.р.в. * расширение реального времени