Неявное объявление функции 'fgetc_unlocked', используя gcc 5.2
У меня есть следующий код:
#include <stdio.h>
int main() {
putc_unlocked('a', stdout);
return 0;
}
Я не получаю ошибку при компиляции с помощью gcc file.c
Однако, если я использую gcc -std=c11 file.c
, Я получил:
file.c: In function ‘main’:
file.c:4:2: warning: implicit declaration of function ‘putc_unlocked’ [-Wimplicit-function-declaration]
putc_unlocked('a', stdout);
^
Зачем?
2 ответа
Компиляция с использованием -std=cxx
где xx равно 99 или 11, в зависимости от того, какую версию C вы используете, будут использоваться другие заголовочные файлы, чем при компиляции с -std=gnuxx
(где снова хх = 99 или 11).
Настройка по умолчанию (если вы не указываете аргумент командной строки) для GCC 5.2 предназначена для -std=gnu11
,
Настройки GNU определяют макросы:
_GNU_SOURCE
, который включает только функции GNU;_POSIX_SOURCE
, который включает функции POSIX;- а может другие? (
_BSD_SOURCE
это возможно, но я не уверен).
Если вы компилируете с -std=cxx
тогда вы получаете стандартный C, а не какие-либо расширения.
Так что это предупреждение, потому что эта функция не является частью стандарта C. Таким образом, вы получаете неявное объявление функции (которая была разрешена старыми стандартами C и сохранена для обратной совместимости).
Вы можете редактировать свой файл, чтобы иметь #define _POSIX_SOURCE
если вы хотите скомпилировать с -std=cxx
,
Так как -std=c11
обеспечивает строгое пространство имен (как и C89 и C99).
Любой идентификатор, не обязательный для C11, не должен быть видимым. поскольку putc_unlocked
не является идентификатором C11, декларация не видна и, следовательно, декларация неявная.