Вопрос

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

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

  • -Стена
  • -Векстра
  • -Побеждать самому
  • -Актерский состав в стиле Вольда
  • -Woverloaded-виртуальный
  • -Wuninitialized ( Инициализированный )
  • -Wmissing-объявления
  • -Побеждать самому
  • -анси
  • -педантичный

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

Это было полезно?

Решение

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

Там есть кое-какие инструменты:

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

Другие советы

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

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

-педантичные ошибки.

Смотрите больше на ссз(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 выключатель.Если вам нужна более строгая компиляция, то вы должны знать, какому стандарту вы пытаетесь соответствовать.Обычно для текущего c ++ это было бы -std=c++98. ( -ansi выполняет аналогичную функцию в режиме C ++, но -std= является более явным.)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top