...посмотрим внимательно на вывод компилятора при максимально включенных предупреждениях
$ g++ -W -Wall test.cpp
К самой статье это отношения не имеет, но хочется заметить, что заблуждение насчет максимально включенных предупреждений компилятора встречается довольно часто —
-Wall
и -Wextra
(-W
) это еще не все предупреждения. К сожалению, путаница по большей части возникает из-за разработчиков GCC. Начать с того, что имя опции -Wall
само по себе вводит в заблуждение, так они еще добавляют или удаляют предупреждения от версии к версии, или вообще меняют их смысл, чем лично меня иногда просто ставят в тупик. Но надо отдать им должное — компилятор все-таки развивается, и сейчас с помощью предупреждений можно узнать гораздо больше, чем в более ранних версиях.Например, в последней версии GCC (4.4) есть полезные предупреждения, которые нужно включать самостоятельно:
-Wcast-qual
Предупреждает о преобразованиях типа "из const char * в char *".-Wconversion
Предупреждает, если при преобразовании типов может произойти потеря данных. Например, при преобразовании из long в short.-Wredundant-decls
Предупреждает об повторном объявлении чего-нибудь в той же области видимости, даже если это ни на что не влияет.-Wshadow
Предупреждает, если объявление переменной перекрывает объявленную ранее переменную с таким же именем.-Wsign-conversion
Предупреждает, если результат выражения может изменить знак. Например, при преобразовании из int в unsigned int.-Wunreachable-code
Предупреждает, если какой-то фрагмент кода никогда не будет выполнен. Например, если перед этим фрагментом стоит return. Этот флаг специально не был включен в группу-Wall
для того, чтобы можно было разделять сборки debug и release.
И еще некоторые другие:
- -Wcast-align
- -Wformat-nonliteral
- -Wformat-security
- -Wformat-y2k
- -Winit-self
- -Wlogical-op
- -Wmissing-format-attribute
- -Wmissing-include-dirs
- -Woverlength-strings