Подтвердить что ты не робот

Не знает ли ANSI-C ключевое слово 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.

В чем причина этого, и есть ли рекомендуемое исправление?

4b9b3361

Ответ 1

Вам нужно использовать:

gcc -std=c99 -c test.c

Флаг -ansi указывает c90:

Параметр -ansi эквивалентен -std = c90.

ANSI C была фактически версией C версии 1990 года, в которой не было ключевого слова inline.

Ответ 2

Нет, ANSI C не имеет inline.

Вторая команда фактически переопределяет -std=c99 с помощью -ansi (оба они влияют на -std=), поэтому вы фактически компилируете с использованием ANSI C (нет C99).

Ответ 3

Ключевое слово inline не является частью исходного стандарта ANSI C (C89), поэтому библиотека не экспортирует никаких встроенных определений функций по умолчанию. Встроенные функции были введены официально в новых Стандарт C99, но большинство компиляторов C89 также включили в качестве удлинение в течение длительного времени.

цитируется веб-сайт Gnu

Ответ 4

Причина, по которой он отлично работает без опции ansi, заключается в том, что gcc по умолчанию имеет значение -std = gnu90, что является ANSI/C89 плюс расширениями (одна из которых, что неудивительно, является поддержкой встроенных функций). Если вы просто хотите поддержку ANSI C, вам не нужны никакие параметры, если вы не хотите строгого соответствия стандарту (что, очевидно, может быть полезно, если ваш код будет скомпилирован для других компиляторов).