Лучший уровень предупреждения компилятора для компиляторов C/C++? [закрытый]

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

localhost // myAPIProject

Поскольку ошибка в сообщении говорится, что это не http: // то я изменил URL и поместил префикс http, как указано ниже, и ошибка исчезла.

http: // localhost // myAPIProject

45
задан 30 December 2008 в 09:39
поделиться

12 ответов

Это - ряд дополнительно-параноидальных флагов, которые я использую для кода 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

, Который должен дать Вам что-то для начала работы. В зависимости от проекта Вы, возможно, должны были бы снизить его для не наблюдения того, чтобы попросить прибыть из сторонних библиотек (которые обычно довольно небрежны о том, чтобы быть предупреждающим свободный.), Например, код вектора/матрицы Повышения сделает g ++, испускают много шума.

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

46
ответ дан Alexander L. Belikoff 8 November 2019 в 00:48
поделиться

Компиляторы GCC становятся более строгими с каждой новой версией. Используйте флаг -ansi для создания предупреждений для нарушений самой строгой интерпретации стандартов языка ANSI. Это обычно - материал, который просто, оказывается, работает в Вашем текущем компиляторе, но может произвести ошибки в следующей версии или в других компиляторах. Тот флаг поможет Вам избежать необходимости портировать свой код каждый раз, когда Вы переключаете компиляторы/версии.

0
ответ дан palm3D 8 November 2019 в 00:48
поделиться

На GCC для предпочтения я использую -Wall -Wextra -Wwrite-strings -Werror, и также определяю стандарт с std=. Какой стандарт зависит от проекта: преимущественно на том, насколько портативный это должно быть.

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

, Конечно, при контакте со сторонним кодом, иногда Вы не можете избавиться от предупреждений. Тогда я решил бы в зависимости от конкретного случая, ослабить ли эти -W опции, удалить -Werror и записать сценарий, чтобы проверить, что только ожидают, что предупреждения происходят, или возможно изменяют сторонний код (или чтобы "зафиксировать" предупреждение или отключить его с прагмами если возможный).

3
ответ дан jww 8 November 2019 в 00:48
поделиться

В Визуальном C я использую/w3. Я нахожу, что w4 подбрасывает слишком много шума (многое из него из библиотек MS) для прохождения через на каждой сборке. Дополнительные предупреждения очень незначительны и не были причиной ошибки до сих пор.

1
ответ дан Patrick 8 November 2019 в 00:48
поделиться

Мне нравится - Стена и строгие прототипы, а также определения неявной функции. Ошибки на тех могут быть очень полезными. Существует также-Wextra, который возьмет весь виды из вещей как вещи, Вы намеревались быть условными выражениями, но случайно записали как операторы:

if (something);
   classic_way_to_leak_memory();

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

я - также тип, каламбурящий злодей, таким образом, я склонен устанавливать-Fno-strict-aliasing также, если пользователь не хочет его. Безопасное управление памятью в классике C трудно выполнить иначе.

3
ответ дан Tim Post 8 November 2019 в 00:48
поделиться

Спасибо все для их ответов. Это было некоторое время, так как я использовал что-либо кроме 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 лет назад) что-либо выше уровня предупреждения значения по умолчанию на компиляторе CC Семинара Sun было слишком много. Я также думаю, что это, возможно, было верно для компилятора Intel. Я не был актуален с не компиляторы гну некоторое время.

0
ответ дан 8 November 2019 в 00:48
поделиться

Я делаю всю разработку с Предупреждением как включенные Ошибки.

, Так как я все еще разрабатываю в VC6, у меня есть много #pragma в моем коде (4786 главным образом).

4
ответ дан graham.reeds 8 November 2019 в 00:48
поделиться

Я соглашаюсь с litb всегда использовать - Стена. Кроме того, если Вы хотите удостовериться, что Ваш код совместим, можно также использовать - педантичный. Другое предупреждение, которое может быть полезно при обработке объединений и структур на уровне байта является-Wpadded.

8
ответ дан codelogic 8 November 2019 в 00:48
поделиться

Я склонен использовать -Wall (потому что все действительно делают ошибки, никто не прекрасен), но я не использую -Werror (предупреждения обработки как ошибки), потому что время от времени gcc предупреждает о вещах, которые являются правильными так или иначе (ложные положительные стороны).

9
ответ дан Johannes Schaub - litb 8 November 2019 в 00:48
поделиться

На Visual C++ я использую /W4 и /WX (предупреждения обработки как ошибки).

VC также имеет /Wall, но это является несовместимым со стандартными заголовками.

я принимаю решение рассматривать предупреждения как ошибки, потому что это вынуждает меня зафиксировать их. Я фиксирую все предупреждения, даже если это означает добавлять #pragma для игнорирования предупреждения - тот путь, я заявляю явно, что я знаю о предупреждении (таким образом, другие разработчики не пошлют мне по электронной почте об этом).

24
ответ дан herohuyongtao 8 November 2019 в 00:48
поделиться

Существует хороший список опций для GCC здесь: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm . - стена не включает все возможные предупреждения, и некоторым нужно включить explicitely.

3
ответ дан Marco 8 November 2019 в 00:48
поделиться

Я полагаю, что VC также поддерживает

#pragma message ("note to self")

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

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

Вот почему я пытаюсь рассматривать предупреждения как ошибки: большую часть времени компилятор является правильным предупреждением меня, и если он не, я документирую его в коде и предварительно ожидаю

#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )

, я просто читаю , они имеют warning ( N : suppress ) прагма, также.

13
ответ дан xtofl 8 November 2019 в 00:48
поделиться