Почему я могу использовать gets () в gcc-std=c11?

на gets() функция была удалена из языка Си. В стандарте такой функции не существует.

тем не менее я компилирую следующий код:

#include <stdio.h>

int main (void)
{
  (void) gets (NULL);
}

используя

gcc -std=c11 -pedantic-errors -Wall -Wextra

и он компилируется без ошибок или предупреждений. Аналогично,

#include <stdio.h>

int gets;

int main (void)
{}

не будет компилироваться (ошибка: "получает", объявленный как другой вид символа).

в стандарте 4. Соответствие §6 мы читаем:

в соответствии реализация может иметь расширения (включая дополнительные библиотечные функции), при условии, что они не меняют поведение строго соответствующая программа

Учитывая вышеизложенное, я не думаю, что gcc является стандартным, даже в педантическом режиме. Для этого есть причина? Это преднамеренно или это ошибка?

GCC версии 4.9.1.

Edit:

gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1

3 ответов


GCC-это просто компилятор, а не вся реализация.

в моей системе (Linux Mint 17.3, gcc 4.8.4, GNU libc 2.19) я получаю:

$ gcc -std=c11 -pedantic-errors -Wall -Wextra -c c.c
c.c: In function ‘main’:
c.c:5:3: error: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
   (void) gets (NULL);
   ^

чтобы правильно диагностировать ошибки реализация должен быть соответствующий. Это означает как компилятор (который никогда не предоставлял gets в первую очередь) и библиотека.

вы используете библиотеку, которая по-прежнему предоставляет


ключевой линии код:

#include <stdio.h>

вы обновили библиотеку и заголовки вашей системы C? Они также являются частью реализации C вместе с компилятором.


обновление это может быть не ответ на вопрос, я пытаюсь сделать его информационным.

я случайно обнаружил, что gcc упомянул получает не соответствует стандарту C11 для некоторых библиотечных проблем glibc 2.16.

см. состояние поддержки gcc C11:https://gcc.gnu.org/wiki/C11Status croped from the above link

но я не могу найти определение "проблема с библиотекой" и текущее состояние для других версий в glibc.

поэтому я попробовал на своей машине ubuntu16.04 с версией gcc 5.3.1 20160413, glibc версии Ubuntu GLIBC 2.23 Мы можем получить достаточное предупреждение во время компиляции, но по-прежнему нормально выполнять выходной объектный файл для "обратной совместимости".

warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
warning: the `gets' function is dangerous and should not be used.