Использовать ли флаг -pedantic в g ++ или нет?

16

Я изучаю C ++ и использую g ++ в Linux для практики.

  1. Я хочу знать, используют ли люди, работающие программистами, g ++ -педантический флаг, а также его важность в реальном мире.

  2. А как насчет других компиляторов, они также позволяют это? Стало ли это стандартом де-факто?

Мне интересно, потому что я читаю C ++ Primer, где автор указывает, что использование неконстантного выражения в качестве измерения в определении массива запрещено, и g ++ по умолчанию позволяет это. И могут быть другие вещи, о которых я не знаю.

user803563
источник

Ответы:

21

Да, абсолютно так. На самом деле, вам нужно изучить страницу руководства и включить больше предупреждений, чем -pedanticи -Wallбудет делать.

Нет, стандарта нет. MSVC использует, /W4например.

Эдвард Стрендж
источник
7
+1, я обычно делаю -Wall -Wextra -Werror -pedantic -std=c++0x:)
Greyfade
4
@JaredBurrows: На самом деле я перестал использовать -pedanticC ++, поскольку руководство GCC подразумевает, что оно предназначено только для C, и я перешел к использованию -std=c++14в новых проектах.
Greyfade
1
@greyfade Ах, я должен был сказать, -Wall -Wextra -Werror -std=c++14:)
Джаред Берроуз
1
Я только что обнаружил -pedantic-errors, который выдает ошибки, а не предупреждения.
Галик
6
@VillasV Хорошо -Werrorпревращает все предупреждения в ошибки. Но -pedantic-errorsтолько делает ошибки из Standard ICO C++нарушений.
Галик
10

Хотя я довольно давно не программировал C ++, я бы посоветовал вам использовать этот флаг. Это поможет вам создать совместимый со стандартами код и облегчит жизнь каждому. AFAIK, большинство других компиляторов не поддерживают расширения gcc / g ++.

Я ненавижу это, например, когда я не могу скомпилировать код только потому, что первоначальный разработчик решил использовать нестандартные расширения компилятора.

Могу поспорить, что огромное количество (скажем, 20%) программ linux, написанных на C / C ++, не будет компилироваться ни с чем, кроме gcc / g ++, что меня немного огорчает. Всегда придерживайтесь стандартов.

сокол
источник
2
В последний раз, когда я пытался использовать другие компиляторы, я бы сказал, что более 20% будут работать с другими компиляторами, а 80% зависят от расширений gcc.
Джерри Гроб
6

Лично я использую:

-Wall -Wextra -Wshadow -Weffc ++ -Wstrict-aliasing -ansi -pedantic -Werror

Таким образом, включается множество предупреждений, но что более важно, все предупреждения рассматриваются как ошибки (так как большинство предупреждений являются логическими ошибками в вашем мышлении).

Мартин Йорк
источник
Вы бы что-нибудь добавили к этому списку в 2019 году?
Ayxan
1
@Ayxan Это минимальный набор, который я рекомендую всем использовать. Но есть еще куча полезных. Но вам нужно ознакомиться с документацией и посмотреть, полезны ли они для вас. Посмотрите на-Wunreachable-code -Wno-long-long
Мартин Йорк
1
@Ayxan При построении кода профилирования:-g -pg -fprofile-arcs -ftest-coverage
Мартин Йорк,
1
@Ayxan При сборке отладки-g -O0
Мартин Йорк,
1
@Ayxan При создании производственного кода-O3
Мартин Йорк,
1

Весьма важно использовать -pedanticфлаг.

Я бы только добавил, что с текущим стандартом желательно использовать что-то похожее на:

-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors

Где:

  • -std=c++17говорит, что придерживаться пересмотренного стандарта C ++, опубликованного в 2017 году, вы можете прочитать больше об этом здесь .

  • -Wall говорит это:

    Включите все предупреждения о конструкциях, которые некоторые пользователи считают сомнительными, и которых легко избежать (или измените, чтобы предотвратить предупреждение), даже в сочетании с макросами, другими словами некоторый набор предупреждений.

  • -Wextra говорит, чтобы включить еще несколько предупреждений, но не все.

  • -Werror говорит ему превратить все предупреждения в ошибки.

  • -Wpedanticили просто -pedanticговорит это:

    Выпускать все предупреждения, требуемые строгими стандартами ISO C и ISO C ++; отклонить все программы, которые используют запрещенные расширения, и некоторые другие программы, которые не соответствуют ISO C и ISO C ++.

  • -pedantic-errors говорит ему выдавать ошибку всякий раз, когда базовый стандарт (см. -Wpedantic) требует диагностики.


Этот набор обычно полезен не только для начинающих, так как они постепенно узнают, что каждое предупреждение может привести к ошибке, но и для обычного использования.

Все варианты предупреждений подробно описаны здесь, на странице GNU / GCC .

LinuxSecurityFreak
источник