Ответ 1
Вам нужно использовать:
gcc -std=c99 -c test.c
Флаг -ansi
указывает c90:
Параметр -ansi эквивалентен -std = c90.
ANSI C была фактически версией C версии 1990 года, в которой не было ключевого слова inline
.
При компиляции чего-то простого, как
inline int test() { return 3; }
int main()
{
test();
return 0;
}
с gcc -c test.c
, все идет хорошо. Если добавлено ключевое слово -ansi
, gcc -ansi -c test.c
, появляется сообщение об ошибке
test.c:1:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
Это верно, даже если выбран стандарт C99, gcc -std=c99 -ansi -c test.c
.
В чем причина этого, и есть ли рекомендуемое исправление?
Вам нужно использовать:
gcc -std=c99 -c test.c
Флаг -ansi
указывает c90:
Параметр -ansi эквивалентен -std = c90.
ANSI C была фактически версией C версии 1990 года, в которой не было ключевого слова inline
.
Нет, ANSI C не имеет inline
.
Вторая команда фактически переопределяет -std=c99
с помощью -ansi
(оба они влияют на -std=
), поэтому вы фактически компилируете с использованием ANSI C (нет C99).
Ключевое слово inline не является частью исходного стандарта ANSI C (C89), поэтому библиотека не экспортирует никаких встроенных определений функций по умолчанию. Встроенные функции были введены официально в новых Стандарт C99, но большинство компиляторов C89 также включили в качестве удлинение в течение длительного времени.
цитируется веб-сайт Gnu
Причина, по которой он отлично работает без опции ansi, заключается в том, что gcc по умолчанию имеет значение -std = gnu90, что является ANSI/C89 плюс расширениями (одна из которых, что неудивительно, является поддержкой встроенных функций). Если вы просто хотите поддержку ANSI C, вам не нужны никакие параметры, если вы не хотите строгого соответствия стандарту (что, очевидно, может быть полезно, если ваш код будет скомпилирован для других компиляторов).