Эта записка говорит:
-ansi
: указывает компилятору реализовать опцию языка ANSI. Это отключает определенные «функции» GCC, которые несовместимы со стандартом ANSI.
-pedantic
: используется в сочетании с-ansi
, это говорит компилятору строго придерживаться стандарта ANSI, отклоняя любой код, который не соответствует.
Перво-наперво:
- Какова цель
-pedantic
и-ansi
параметры компилятора GCC / G ++ (я не мог понять вышеприведенное описание)? - Может кто-нибудь сказать мне правильные обстоятельства для использования этих двух вариантов?
- Когда я должен их использовать?
- Они важны?
Я использую это все время в своем коде.
-ansi
Флаг эквивалентен-std=c89
. Как уже отмечалось, он отключает некоторые расширения GCC. Добавление-pedantic
отключает больше расширений и генерирует больше предупреждений. Например, если у вас строковый литерал длиннее 509 символов, то-pedantic
предупреждает об этом, поскольку он превышает минимальный предел, требуемый стандартом C89. То есть каждый компилятор C89 должен принимать строки длиной 509; им разрешено принимать более длинные строки, но если вы педантичны, нельзя использовать более длинные строки, даже если компилятору разрешено принимать более длинные строки, и без предупреждений педантизма GCC их тоже примет.источник
-std=c89 -pedantic
означает, что вы можете легче перемещаться между различными компиляторами на других платформах. Как только вы начинаете использовать<windows.h>
, совместимость с другими системами становится проблематичной.-pedantic
, но большая часть моего кода все еще компилирует ОК , когда я снова включить его (одна программа , которая не была явно с помощью__int128
типов, которые являются педантично неправильно). Я думаю, что была промежуточная стадия, когда GCC был слишком шумным (на мой взгляд)-pedantic
. Я только что протестировал около 300 исходных файлов - некоторый библиотечный код, некоторые команды, некоторые тестовые программы SO - и была только одна ожидаемая проблема. В настоящее время используется GCC 4.8.2 в Mac OS X 10.9.2.-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. Рассмотрим для примера программуВ пункте 6.7.6.2p1 проекта С11 n1570 говорится :
Стандарт C требует, чтобы длина массива была больше нуля; и этот пункт в ограничениях ; Стандарт гласит следующее 5.1.1.3p1 :
Однако, если вы скомпилируете программу
gcc -c -std=c90 pedantic_test.c
, предупреждение не выдается.-pedantic
заставляет компилятор фактически соответствовать стандарту C ; поэтому теперь он выдаст диагностическое сообщение, как того требует стандарт:Таким образом, для максимальной переносимости указание версии стандарта недостаточно, вы также должны использовать
-pedantic
(или-pedantic-errors
), чтобы убедиться, что GCC действительно соответствует букве стандарта.Последняя часть вопроса была об использовании
-ansi
с C ++ . ANSI никогда не стандартизировал язык C ++ - только перенял его из ISO, так что это примерно так же важно, как сказать «английский язык стандартизирован Францией». Однако GCC все еще, кажется, принимает это для C ++, как бы глупо это ни звучало.источник
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.По сути, это сделает ваш код намного проще для компиляции под другими компиляторами, которые также реализуют стандарт ANSI, и, если вы осторожны, в каких библиотеках / вызовах API вы используете, под другими операционными системами / платформами.
Первый, отключает ОСОБЫЕ функции GCC. (-ansi) Второй, будет жаловаться на НИЧЕГО вообще на то, что не соответствует стандарту (не только специфические особенности GCC, но и ваши конструкции тоже.) (-pedantic).
источник
Если ваш код должен быть переносимым, вы можете проверить, что он компилируется без каких-либо расширений gcc или других нестандартных функций. Если ваш код компилируется
-pedantic -ansi
тогда, теоретически он должен компилироваться нормально с любым другим стандартным компилятором ANSI.источник
-pedantic
не отключает все расширения, это оставляет кучу вещей с двойным подчеркиванием. Поэтому было бы точнее сказать, что если ваш код компилируется-pedantic -ansi
, и он также выглядит правдоподобно, как если бы он компилировался в других реализациях, то он будет компилироваться.Если вы пишете код, который вы планируете собирать, который будет компилироваться на самых разных платформах, с несколькими различными компиляторами, то использование этих флагов самостоятельно поможет вам не создавать код, который компилируется только в GCC.
источник
Другие ответили достаточно. Я просто хотел бы добавить несколько примеров частых расширений:
main
Функция возвращенияvoid
. Это не определено стандартом, то есть оно будет работать только на некоторых компиляторах (включая GCC), но не на других. Кстати,int main()
иint main(int, char**)
две подписи, которые стандарт определяет.Другое популярное расширение - возможность объявлять и определять функции внутри других функций:
Это нестандартно. Если вы хотите такое поведение, посмотрите лямбды C ++ 11
источник
Pedantic делает так, что компилятор gcc отклоняет все расширения GNU C, а не только те, которые делают его совместимым с ANSI.
источник