Ответ 1
Помимо педантичной ошибки, которую все остальные предложили, ИМО, всегда полезно запускать lint как часть процесса компиляции.
Есть несколько инструментов:
- cpplint (бесплатно)
- gimple lint
- coverity
Они сэкономит вам много времени.
Я работаю над большим совместным проектом С++, который разрабатывается и работает на разных уровнях Linux, OS X и Windows. Мы собираем эти платформы с помощью GCC, Visual Studio С++ и компилятора Intel С++. Поскольку все больше и больше людей начинают разрабатывать код для проекта, мы начинаем видеть странные ошибки в компиляции и времени выполнения, которые специфичны для конкретных компиляторов в конкретных операционных системах. Примером этого является неявное включение заголовков, которые, как вам кажется, обнаруживают некоторые пары OS/compiler, случайно перегружая функцию из базового класса в производном классе.
Моя цель - сделать компиляцию на GCC более строгой и уловить больше ошибок на всех платформах, чтобы мы не справлялись с этими проблемами. Вот мой список флагов, который я собираюсь опробовать для GCC, который я нашел через Google и справочные страницы GCC:
Каковы другие флаги, которые люди используют для создания GCC (и, что менее важно, Visual Studio С++ и Intel С++ Compiler), подчиняются более строгим стандартам языка С++? Конкретно о том, какой компилятор и версия вы говорите, поскольку некоторые из них могут быть не реализованы во всех версиях всех компиляторов.
Помимо педантичной ошибки, которую все остальные предложили, ИМО, всегда полезно запускать lint как часть процесса компиляции.
Есть несколько инструментов:
Они сэкономит вам много времени.
Вы можете сделать педантичные предупреждения в ошибках с помощью -pedantic-errors
. Это не позволит разработчикам игнорировать его. В этом случае вы можете сделать все предупреждения и с ошибками -Werror
, хотя в некоторых случаях это может быть результативным (возможно, не в вашем).
В целом, я думаю, что если придерживаться строгих стандартов, наиболее полезными могут быть опции -pedantic
.
-pedantic-ошибки.
Подробнее о gcc (1).
Скопируйте и вставьте ниже строки в свой мастер файл cmake. ниже строка содержит почти самые полезные флаги компилятора, чтобы проверить себя более строгими.
set(CMAKE_CXX_FLAGS "-O0 -fno-elide-constructors -pedantic-errors -ansi -Wextra -Wall -Winit-self -Wold-style-cast -Woverloaded-virtual -Wuninitialized -Wmissing-declarations -Winit-self -std=c++98")
Если вы не используете cmake, просто скопируйте флаги, которые в двойных кавычках и отправите вашему компилятору
Также, как и -pendantic
, вы также должны указать переключатель -std
. Если вам нужен более строгий компилятор, вы должны знать, какой стандарт вы пытаетесь выполнить. Обычно для текущего С++ это будет -std=c++98
. (-ansi
выполняет аналогичную функцию в режиме С++, но -std=
более явный.)
В подобной ситуации мы сдались и перешли в ACE framework, скрывая разницу между платформами.
Я написал сообщение в блоге на эту тему после изучения нескольких вариантов. Вам также необходимо обрабатывать случаи, когда вы используете другие библиотеки, но они не следуют строгой компиляции. К счастью, есть и простой способ справиться с ними. Я использовал это во всех своих проектах.
Короче говоря, используйте следующие параметры компилятора, чтобы включить очень строгий режим (ниже я вставляю CMakeLists.txt):
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wstrict-aliasing -pedantic -fmax-errors=5 -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option ${CMAKE_CXX_FLAGS}")
Подробнее о том, как включить и отключить этот строгий режим для определенных частей кода, можно подробнее: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/