-ansi
является устаревшим переключателем, который запрашивает компилятор в соответствии с 30-летней устаревшей версией стандарта C , ISO / IEC 9899: 1990 , который по сути является ребрендингом стандарта ANSI X3.159-1989 «Язык программирования C» . Почему устарел? Потому что после того, как C90 был опубликован ISO, ISO отвечал за стандартизацию C, и любые технические исправления к C90 были опубликованы ISO. Таким образом, он более пригоден для использования -std=c90
.
Без этого переключателя последние компиляторы C GCC будут соответствовать языку C, стандартизированному в ISO / IEC 9899: 2011 , или новейшей редакции 2018 года.
К сожалению, есть некоторые ленивые поставщики компиляторов, которые считают, что приемлемо придерживаться устаревшей устаревшей стандартной версии, для которой документ по стандартизации даже не доступен из стандартных органов.
Использование переключателя помогает обеспечить компиляцию кода в этих устаревших компиляторах.
Это -pedantic
интересный. В отсутствие -pedantic
, даже когда запрашивается конкретный стандарт, GCC по-прежнему допускает некоторые расширения, которые не приемлемы в стандарте C. Рассмотрим для примера программу
struct test {
int zero_size_array[0];
};
В пункте 6.7.6.2p1 проекта С11 n1570 говорится :
В дополнение к необязательным квалификаторам типов и ключевому слову static, [и] могут разделять выражение или *. Если они разграничивают выражение (которое определяет размер массива), выражение должно иметь целочисленный тип. Если выражение является константным выражением, оно должно иметь значение больше нуля. [...]
Стандарт C требует, чтобы длина массива была больше нуля; и этот пункт в ограничениях ; Стандарт гласит следующее 5.1.1.3p1 :
Соответствующая реализация должна генерировать по крайней мере одно диагностическое сообщение (идентифицированное определенным реализацией способом), если блок преобразования или блок предварительной обработки содержит нарушение какого-либо синтаксического правила или ограничения, даже если поведение также явно указано как неопределенное или реализация-реализация. определены. Диагностические сообщения не должны создаваться при других обстоятельствах. 9)
Однако, если вы скомпилируете программу gcc -c -std=c90 pedantic_test.c
, предупреждение не выдается.
-pedantic
заставляет компилятор фактически соответствовать стандарту C ; поэтому теперь он выдаст диагностическое сообщение, как того требует стандарт:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Таким образом, для максимальной переносимости указание версии стандарта недостаточно, вы также должны использовать -pedantic
(или -pedantic-errors
), чтобы убедиться, что GCC действительно соответствует букве стандарта.
Последняя часть вопроса была об использовании -ansi
с C ++ . ANSI никогда не стандартизировал язык C ++ - только перенял его из ISO, так что это примерно так же важно, как сказать «английский язык стандартизирован Францией». Однако GCC все еще, кажется, принимает это для C ++, как бы глупо это ни звучало.