Параметры выбора диалекта, такие как -ansi
и -std=c99
, заставляют компилятор определять определенные макросы (в дополнение к изменению принятого диалекта).
Заголовочные файлы библиотеки реагируют на эти макросы.
То, как именно они реагируют, зависит от системы (компилятор не предоставляет библиотеку C), но обычное поведение, которое вы можете ожидать, заключается в том, что если вы используете только один из этих флагов (без какого-либо другого «макроса выбора функций»), он имеет эффект сокрытия объявлений функций, макросов и других глобальных символов, которые не находятся в указанном диалекте ISO C.
ISO C ничего не знает о getchar_unlocked
. Наличие такого объявления в <stdio.h>
(обычно в заголовке ISO C) является расширением POSIX, которое в основном не соответствует требованиям, поскольку getchar_unlocked
является идентификатором, который могут использовать строго соответствующие программы C, даже если они включают <stdio.h>
. Когда вы используете -ansi
или -std=c99
, заголовок <stdio.h>
слушает и преобразует себя в форму, соответствующую ISO-C, скрывая такие расширения.
В хорошо функционирующих системах POSIX вы можете запросить диалект ISO C и, чтобы некоторые элементарные функции POSIX 1990-х годов были видны в файлах заголовков, например, так:
gcc -std=c99 -D_POSIX_SOURCE ...
^^^^^ "feature selection macro"
В этих макросах выбора функций есть целая наука, слишком широкая для этого вопроса и ответа; некоторые их формы имеют значения, например -D_XOPEN_SOURCE=500
. _POSIX_SOURCE
не нуждается в аргументах; это просто определено или нет, но _POSIX_C_SOURCE
является числовым.
Я только что проверил glibc и Cygwin: на обоих _POSIX_SOURCE
достаточно, чтобы открыть объявление getchar_unlocked
. Он довольно старый, начиная с POSIX.1 1996 года.
Остерегайтесь: в некоторых системах макросы выбора нескольких функций не работают разумно; они дают вам пересечение набора, а не объединение, так что -D_POSIX_SOURCE
и -D_BSD_SOURCE
вместе в конечном итоге означают «Объявите мне только те несколько функций, которые характерны для классической BSD, которые также были стандартизированы в POSIX», что означает, что почти ничего не объявлено.
07.07.2016
POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE || _BSD_SOURCE || _SVID_SOURCE
--or- - выберите опциюgcc
-std=xxx, которая включает функции posix, такие как-std=gnu99
09.07.2016