Почему я могу использовать 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
но я не могу найти определение "проблема с библиотекой" и текущее состояние для других версий в 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.