Делаем GCC и другие компиляторы C ++ очень строгими - PullRequest
17 голосов
/ 29 января 2009

Я работаю над большим совместным проектом C ++, который разрабатывается и работает на различных версиях Linux, OS X и Windows. Мы компилируем на этих платформах с помощью GCC, Visual Studio C ++ и компилятора Intel C ++. Поскольку все больше и больше людей начинают разрабатывать код для проекта, мы начинаем видеть странные ошибки при компиляции и во время выполнения, которые характерны для конкретных компиляторов в конкретных операционных системах. Примером этого является неявное включение заголовков, которые некоторые пары ОС / компилятор могут найти для вас, случайно перегружая функцию из базового класса в производном классе.

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

  • -стена
  • -Wextra
  • -Winit-я
  • -Wold стиле литой
  • -Woverloaded виртуальные
  • -Wuninitialized
  • -Wmissing-декларации
  • -Winit-я
  • -ansi
  • -pedantic

Какие другие флаги используются людьми, чтобы заставить GCC (и, что менее важно, Visual Studio C ++ и Intel C ++ Compiler) подчиняться более строгим стандартам языка C ++? Уточните, о каком компиляторе и версии вы говорите, поскольку некоторые из них могут быть реализованы не во всех версиях всех компиляторов.

Ответы [ 7 ]

8 голосов
/ 29 января 2009

Помимо педантичной ошибки, которую все остальные предлагали, IMO, всегда хорошо запускать lint как часть процесса компиляции.

Есть несколько инструментов:

Они сэкономят много вашего времени.

3 голосов
/ 19 декабря 2013

Скопируйте и вставьте нижнюю строку в ваш главный файл 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, просто скопируйте флаги в двойных кавычках и отправьте компилятору

3 голосов
/ 29 января 2009

-pedantic-ошибки.

Подробнее о gcc (1) .

3 голосов
/ 29 января 2009

Вы можете превратить педантичные предупреждения в ошибки с помощью -pedantic-errors. Это не позволит разработчикам игнорировать это. В этом отношении вы также можете превратить все предупреждения в ошибки с помощью -Werror, хотя в некоторых случаях это может привести к обратным результатам (хотя, возможно, и не к вашим).

В целом, я думаю, что с точки зрения соблюдения строгих стандартов, опции -pedantic являются наиболее полезными.

2 голосов
/ 29 января 2009

Как и -pendantic, вы также должны предоставить переключатель -std. Если вам нужна более строгая компиляция, вы должны знать, какому стандарту вы пытаетесь соответствовать. Обычно для текущего c ++ это будет -std=c++98. (-ansi выполняет аналогичную функцию в режиме C ++, но -std= является более явным.)

1 голос
/ 12 июля 2017

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

Короче говоря, используйте следующие параметры компилятора, чтобы включить очень строгий режим (ниже я поместил в 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/

1 голос
/ 29 января 2009

В аналогичной ситуации мы сдались и перешли на ACE framework , скрывая разницу между платформами.

...