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

Каков режим C по умолчанию для текущего gcc (особенно на Ubuntu)?

Когда я прошу увидеть текущую версию cc, я получаю это.

$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ 

Что бы я хотел знать, это если используются c89, c90, c99 или c11.

4b9b3361

Ответ 1

Это подробно описано в руководстве gcc, доступном (если оно установлено), набрав info gcc или онлайн здесь. Соответствующий раздел руководства 4.7.2 здесь.

По умолчанию gcc не соответствует ни одному из стандартов ANSI/ISO C. Текущее значение по умолчанию эквивалентно -std=gnu90, которое является стандартом 1989/1990 с расширениями, специфичными для GNU. (Некоторая диагностика, требуемая по языковому стандарту, не выдается.) Версия 5.1.0, выпущенная 2015-04-22, изменила значение по умолчанию от -std=gnu90 до -std=gnu11, как описано здесь.

Если вы хотите стандартное соответствие, вы можете использовать любое из следующих действий:

-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic

-std=c90 также может быть записано -ansi, -std=c89 или -std=iso9899:1990.

-std=iso9899:199409 поддерживает стандарт C90 плюс поправку 1995 года, в которой добавлено несколько второстепенных функций (все из которых также находятся на C99).

-std=c99 также может быть записано -std=c9x или -std=iso9899:1999 (имя c9x использовалось до публикации стандарта). Поддержка C99 не совсем завершена, но она закрывается.

-std=c11 также может быть записано -std=c0x или -std=iso9899:2011 (имя c0x использовалось до публикации окончательного стандарта, ошибочно предполагалось, что x не будет превышать 9). Поддержка C11 также является неполной; текущее состояние приведено здесь.

Параметр -pedantic заставляет gcc печатать требуемую диагностику для нарушений ограничений и правил синтаксиса. В некоторых случаях эта диагностика - это всего лишь предупреждения - и нет простого способа различать эти предупреждения и другие предупреждения, которые не требуются языком. Замените -pedantic на -pedantic-errors, чтобы gcc рассматривал нарушения языка как фатальные ошибки.

Быстрая история стандарта:

  • C89 был первым официальным стандартом C, опубликованным ANSI в 1989 году.
  • C90 была ISO версия стандарта, описывающая точно тот же язык, что и C89. ANSI официально приняла ISO-версию стандарта. Было два технических исправления, исправляющих некоторые ошибки.
  • C95 был поправкой к C90, добавив несколько функций, главным образом орграфов и широкую поддержку символов. Насколько я знаю, объединенная версия никогда не публиковалась.
  • C99 был выпущен ISO в 1999 году. Было три технических исправления.
  • C11 был выпущен ISO в 2011 году. Было одно Техническое исправление, в котором были определены определения __STDC_VERSION__ и __STDC_LIB_EXT1__.

ANSI не выпускала собственные версии стандартов 1999 или 2011 годов, вместо этого применяя стандарты ISO.

N1256 - свободно доступный черновик стандарта C99, в который вошли 3 технических исправления.

N1570 - свободно доступный черновик стандарта C11. Между ним и опубликованным стандартом C11 есть несколько незначительных отличий, а также одно техническое исправление. Для получения дополнительной информации см. мой ответ на этот вопрос.

Ответ 2

Первая строка даст вашу версию GCC (4.7.2)

(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

Когда вы компилируете свой код, вы можете указать, какую версию C/С++ вы хотите использовать, добавив -std=c99 или -std=c99...

Примечание gnu89 используется по умолчанию.

Ответ 3

полезная информация из info gcc для gcc6 и https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards для gcc5

версия gcc 6.3.1

2.1 C Language
==============
 The default, if no C language dialect options are given, is
'-std=gnu11'.

2.2 C++ Language
================
 The default, if no C++ language dialect options are given, is
'-std=gnu++14'.

версия gcc 5.4.0

2.1 C Language
==============
The default, if no C language dialect options are given, is -std=gnu11

2.2 C++ Language
================
The default, if no C++ language dialect options are given, is -std=gnu++98

Для C режим по умолчанию остается std = gnu11, но для С++ он перепрыгнул из std = gnu ++ 98 в std = gnu ++ 14

Ответ 4

Одна вещь, о которой нужно знать, параметр -std = для gcc не может использоваться для "песочницы" компилятора в не поддерживающие конструкции из более поздних версий стандарта C. Это верно с или без -pedantic

Вы не можете зависеть от gcc -std=c89 -pedantic, чтобы дать вам ошибки или предупреждения, если вы попытаетесь скомпилировать некоторые конструкторы кода C99. В некоторых случаях это будет, в других - нет. Например, он с радостью компилирует код, который использует спецификатор формата %zu в вызове printf(), даже если он не был добавлен до C99.

Ответ 5

Команда gcc по умолчанию - это диалект GNU ISO C90 (включая некоторые функции C99). Это значение по умолчанию для кода C.