Какой уровень предупреждений компилятора вы рекомендуете для разных компиляторов C / C++?
gcc и g ++ позволят вам уйти от многих на уровне по умолчанию. Я считаю, что лучший уровень предупреждения для меня - «-Wall». И я всегда стараюсь исправить код генерируемых предупреждений. (Даже глупые об использовании скобок для правил логического приоритета или о том, что я действительно имею в виду 'if (x = y)')
Какие уровни вам больше всего нравятся для различных компиляторов, таких как Sun CC, aCC (HPUX?), Visual Studio, Intel?
Редактировать:
Я просто хотел указать, что я не использую «-Werror» (но я понимаю его полезность) в gcc / g ++, потому что я использую:
#warning "this is a note to myself"
в нескольких местах моего кода. Все ли компиляторы понимают макрос #warning?





Я склонен использовать -Wall (потому что все делают ошибки, никто не идеален), но я не использую -Werror (рассматриваю предупреждения как ошибки), потому что время от времени gcc предупреждает о вещах, которые в любом случае правильны (ложные срабатывания).
Итак, если gcc выдает вам 100 предупреждений, вы просматриваете их все при каждой компиляции? В противном случае я не понимаю, как вы справляетесь с настоящими предупреждениями, похороненными в куче ложных срабатываний ...
Я тоже не использую Werror. Существуют предупреждения (неиспользуемые функции), исходящие из исходного кода, сгенерированного flex / bison, которые было бы трудно подавить.
Вы можете обойти предупреждения flex / bison, используя методы, описанные здесь: wiki.services.openoffice.org/wiki/Writing_warning-free_code
Паулюс, я считаю маловероятным, что каждый раз при компиляции вы будете получать новые наборы из сотен предупреждений, если, конечно, код компилируется довольно часто. Но я вижу, как это происходит в первый раз.
Паулюс, если он выдаст мне 100 предупреждений, я исправлю их, поэтому у меня осталось только несколько предупреждений, о которых мне не о чем беспокоиться. использование хороших библиотек позволяет избежать страниц с предупреждениями. также, что говорит codelogic. У меня есть регулярные фазы "предупреждения об убийстве", на которых я их убиваю :)
codelogic, спасибо за ссылку. Оказывается, я оставил только одно предупреждение в flex. Я использую:% option noyywrap% option nounput для подавления предупреждений об этих функциях. Тот, от которого я не могу избавиться: Scanner.cc:1241: предупреждение: сравнение знаковых и беззнаковых целочисленных выражений
Я использую -W (также известный как -Wextra) в дополнение к -Wall, так как он выдает некоторые дополнительные предупреждения, в основном из-за опечаток и забытых путей кода (ой, забыл что-то вернуть!). Это действительно помогает отлавливать глупые ошибки на этапе компиляции.
litb, а как насчет предупреждений, о которых вам "не нужно беспокоиться"? ты просто оставишь их? Я предполагаю, что компилятор будет показывать эти предупреждения каждый раз при компиляции. Со временем количество таких предупреждений, наверное, увеличится ... Как же тогда найти настоящие предупреждения?
Продолжение: И если вы не оставляете эти предупреждения, то я не вижу причин не использовать -Werror, потому что вы все равно их все исправляете ...
Паулюс, очень редко я получаю предупреждение, которое не исправлю. но когда это так, тогда действительно просто оставлю это. emacs отлично раскрашивает предупреждения, поэтому я не пропущу других :)
в любом случае, я считаю, что лучше включить все предупреждения, чем включить только несколько, но включить -Werror только потому, что в противном случае невозможно было бы скомпилировать без ошибок. но это вроде достаточно субъективный вопрос :)
Давным-давно при обучении Си предоставленные заголовки библиотек вызвали предупреждения. Вздох.
Дэвид, у gcc есть особые способы справиться с этим: gcc.gnu.org/onlinedocs/cpp/System-Headers.html
В Visual C++ я использую /W4 и /WX (обрабатываю предупреждения как ошибки).
VC также имеет /Wall, но он несовместим со стандартными заголовками.
Я предпочитаю рассматривать предупреждения как ошибки, потому что это заставляет меня их исправлять. Я исправляю все предупреждения, даже если это означает добавление #pragma, чтобы игнорировать предупреждение - таким образом, я прямо заявляю, что мне известно о предупреждении (чтобы другие разработчики не писали мне об этом по электронной почте).
У нас есть особые предупреждения, на которые мы явно не обращаем внимания, и чистая политика компиляции (без предупреждений) для всего остального.
Я согласен с litb всегда использовать -Wall. Кроме того, если вы хотите убедиться, что ваш код соответствует требованиям, вы также можете использовать -pedantic. Еще одно предупреждение, которое может быть полезно, если вы обрабатываете объединения и структуры на байтовом уровне, - это -Wpadded.
В Visual C я использую / w3. Я считаю, что w4 создает слишком много шума (много из библиотек MS), чтобы проходить через каждую сборку. Дополнительные предупреждения очень незначительны и пока не были причиной ошибки.
Я считаю, что ВК также поддерживает
#pragma message ("note to self")
Но по мере того, как система растет и растет, и вы получаете ночную сборку, над которой одновременно работают 30 разработчиков, требуются дни, чтобы прочитать все заметки самому себе, даже в том объеме, который сам будет делать только чтение заметок и, наконец, сломаться от стресса, не успевать, и уйти в отставку ...
Нет, на самом деле количество предупреждений будет быстро расти, если вы позволите им, и вы не сможете обнаружить действительно важные (неинициализированные переменные, этот указатель, используемый в конструкторе, ...).
Вот почему я стараюсь рассматривать предупреждения как ошибки: в большинстве случаев компилятор правильно предупреждает меня, а если нет, я документирую это в коде и добавляю
#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )
У меня только что прочитал у них тоже есть прагма warning ( N : suppress ).
Я делаю все разработки с включенным предупреждением об ошибках.
Поскольку я все еще разрабатываю VC6, в моем коде много прагм # (в основном 4786).
Мне нравятся прототипы стен и строгие прототипы, а также неявные определения функций. Ошибки в них могут быть очень полезными. Также есть -Wextra, который подберет все виды вещей, таких как вещи, которые вы намеревались быть условными, но случайно написали как операторы:
if (something);
classic_way_to_leak_memory();
В Unix-подобных системах вы должны подчиняться предпочтениям пользователя ENV ... поэтому то, что они видят и сообщают, может полностью отличаться от того, что вам нужно :)
Я тоже любитель каламбура, поэтому я также обычно устанавливаю -Fno-strict-aliasing, если пользователь этого не хочет. В противном случае трудно обеспечить безопасное управление памятью в классическом языке Си.
There's a nice list of options for GCC here: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm. -Wall не включает все возможные предупреждения, а некоторые должны быть включены явно.
А еще лучше см. Руководство GCC: gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Спасибо всем за ответы. Прошло много времени с тех пор, как я использовал что-либо, кроме gcc / g ++. Те, которые мне приходилось использовать давным-давно, это
-fmessage-length = 0 (since g++ had an ugly habit of line breaking messages) -Wno-deprecated (since I worked on a code base pre-existing the std namespace)
Я помню, что (по крайней мере 5 лет назад) все, что превышало уровень предупреждений по умолчанию в компиляторе Sun Workshop CC, было слишком большим. Я также думаю, что это могло быть верно для компилятора Intel. Я давно не знаком с компиляторами, отличными от GNU.
Это набор экстра-параноидальных флагов, которые я использую для кода C++:
-g -O -Wall -Weffc++ -pedantic \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wchar-subscripts -Wcomment -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat -Wformat=2 \
-Wformat-nonliteral -Wformat-security \
-Wformat-y2k \
-Wimplicit -Wimport -Winit-self -Winline \
-Winvalid-pch \
-Wunsafe-loop-optimizations -Wlong-long -Wmissing-braces \
-Wmissing-field-initializers -Wmissing-format-attribute \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked -Wpadded -Wparentheses -Wpointer-arith \
-Wredundant-decls -Wreturn-type \
-Wsequence-point -Wshadow -Wsign-compare -Wstack-protector \
-Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default \
-Wswitch-enum -Wtrigraphs -Wuninitialized \
-Wunknown-pragmas -Wunreachable-code -Wunused \
-Wunused-function -Wunused-label -Wunused-parameter \
-Wunused-value -Wunused-variable -Wvariadic-macros \
-Wvolatile-register-var -Wwrite-strings
Это должно дать вам кое-что для начала. В зависимости от проекта вам может потребоваться смягчить его, чтобы не видеть предупреждения, исходящие от сторонних библиотек (которые обычно довольно небрежно относятся к тому, чтобы быть свободными от предупреждений). Например, код вектора / матрицы Boost заставит g ++ испускать много шума.
Лучший способ справиться с такими случаями - написать оболочку для g ++, которая по-прежнему использует предупреждения, настроенные на максимальное значение, но позволяет подавить их отображение для определенных файлов / номеров строк. Я написал такую утилиту давно и выпущу ее, как только у меня будет время почистить ее.
Кто-то задал аналогичный вопрос, связанный с gcc, и на этот пост была ссылка. Я обновил этот ответ, чтобы удалить повторяющиеся предупреждения (например, -Wformat = 2 подразумевает -Wformat-y2k). См .: stackoverflow.com/a/9862800/852254
g ++ не будет собираться с -Wimplicit, он специфичен для C / ObjC.
Компиляторы GCC становятся строже с каждой новой версией. Используйте флаг -ansi для выдачи предупреждений о нарушениях строжайшей интерпретации языковых стандартов ANSI. Обычно это то, что просто работает в вашем текущем компиляторе, но может привести к ошибкам в следующей версии или в других компиляторах. Этот флаг поможет вам избежать переноса кода каждый раз, когда вы переключаете компиляторы / версии.
gcc -ansi эквивалентно gcc -std = c89; если это то, что вы хотите, это нормально, но если вы предпочитаете C99, используйте '-std = c99'.
В GCC для предпочтения я использую -Wall -Wextra -Wwrite-strings -Werror, а также указываю стандарт с std=. Какой стандарт зависит от проекта: в основном от того, насколько он должен быть переносимым.
Причина, по которой я использую -Werror, заключается в том, что предупреждения неприемлемы (для меня), даже если они не представляют собой настоящую ошибку. Я бы предпочел обойти то, что вызвало предупреждение, чем игнорировать предупреждения каждый раз, когда я компилирую до конца своей жизни. Как только вы разрешите предупреждения в компиляции, очень легко пропустить то, чего не было в прошлый раз.
Конечно, при работе со сторонним кодом иногда не удается избавиться от предупреждений. Затем я решал в каждом конкретном случае, ослаблять ли параметры -W, удалять -Werror и писать скрипт, чтобы проверить, что только ожидаются предупреждения, или, возможно, изменить сторонний код (либо чтобы «исправить» предупреждение или, если возможно, отключить его с помощью прагм).
о компиляторе Intel еще никто не упомянул:
-w3 довольно болтлив, поэтому я бы посоветовал -w2
Еще мне нравится проверять все возможные предупреждения, которые выдает компилятор в моем проекте. К сожалению, ответ по поводу компилятора Intel C++ был для меня не очень информативным (ссылка мертвая). Я провел собственное исследование.
Поскольку я использую Qt 5 и qmake, у меня есть предопределенный уровень предупреждения -w1. Ничего не могу поделать. Но это еще не все, и у ICC есть еще ключи:
-Wcomment
-Weffc++
-Wextra-tokens
-Wformat
-Winline // don't use, show only for example
-Wmain
-Wmissing-declarations
-Wmissing-prototypes
-Wnon-virtual-dtor
-Wp64
-Wpointer-arith
-Wremarks
-Wreturn-type
-Wsign-compare
-Wstrict-aliasing
-Wstrict-prototypes
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-variable
Подробнее обо всем ключи.
Также хочу добавить, что, в отличие от GCC, ICC выдает несколько предупреждений для одного ключа, например для ключа -WeffC++. Если вы хотите видеть только несколько предупреждений из всего списка, используйте ключ -wd.
Отключаю: -wd1418,2012,2015,2017,2022,2013. И предупреждения -wd1572,873,2259,2261 были отключены в qmake по умолчанию.
Я использую PCH, и мне очень неприятно видеть в Qt Creator сообщения об использовании файла PCH, например об ошибке. Чтобы отключить, используйте -Wno-pch-messages.
Для отключения предупреждения в коде я использую:
#if defined(Q_CC_INTEL)
#pragma warning( push )
#pragma warning( disable: 2021 )
#endif
// some code
#if defined(Q_CC_INTEL)
#pragma warning( pop )
#endif
# предупреждение нестандартное; Я думаю, что #error довольно универсален, хотя