Неявное объявление функции '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 определяют макросы:

  1. _GNU_SOURCE, который включает только функции GNU;
  2. _POSIX_SOURCE, который включает функции POSIX;
  3. а может другие? (_BSD_SOURCE это возможно, но я не уверен).

Если вы компилируете с -std=cxx тогда вы получаете стандартный C, а не какие-либо расширения.

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

Вы можете редактировать свой файл, чтобы иметь #define _POSIX_SOURCE если вы хотите скомпилировать с -std=cxx,

Так как -std=c11 обеспечивает строгое пространство имен (как и C89 и C99).

Любой идентификатор, не обязательный для C11, не должен быть видимым. поскольку putc_unlocked не является идентификатором C11, декларация не видна и, следовательно, декларация неявная.

Другие вопросы по тегам