Подтвердить что ты не робот

Создание GCC и других компиляторов С++ очень строго

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

-pedantic-ошибки.

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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