使GCC和其他C ++编译器非常严格

时间:2009-01-29 07:12:46

标签: c++ cross-platform compilation compiler-warnings

我正在开发一个大型协作C ++项目,该项目在各种Linux,OS X和Windows上开发和运行。我们使用GCC,Visual Studio C ++和英特尔C ++编译器在这些平台上进行编译。随着越来越多的人开始为项目开发代码,我们开始在编译和运行时看到特定于特定操作系统上特定编译器的奇怪错误。一个示例是隐式包含某些OS /编译器对似乎为您找到的标头,意外地从派生类中的基类重载函数。

我的目标是使GCC上的编译更加严格,并在所有平台上捕获更多错误,以便我们不会遇到这些问题。这是我正在考虑尝试通过Google和GCC手册页找到的GCC标志列表:

  • -Wall
  • -Wextra
  • -Winit自
  • -WOLD式铸
  • -Woverloaded虚拟
  • -Wuninitialized
  • -Wmissing-声明
  • -Winit自
  • -ansi
  • -pedantic

人们用来制作GCC的其他标志(不太重要的是Visual Studio C ++和英特尔C ++编译器)遵循更严格的C ++语言标准?具体说明您正在讨论的编译器和版本,因为其中一些可能并未在所有编译器的所有版本中实现。

7 个答案:

答案 0 :(得分:8)

除了其他人建议的迂腐错误,IMO,在编译过程中运行lint总是好的。

有一些工具:

他们会节省你的大部分时间。

答案 1 :(得分:3)

您可以使用-pedantic-errors将迂腐警告变为错误。这将阻止开发人员忽略它。对于这个问题,您可以使用-Werror将所有警告变为错误,尽管在某些情况下这可能会产生反效果(但可能不在您的情况下)。

总的来说,我认为,只要遵守严格的标准,-pedantic选项最有帮助。

答案 2 :(得分:3)

-pedantic-错误。

有关gcc(1)的更多信息,请参阅

答案 3 :(得分:3)

将以下行复制并粘贴到您的主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,只需用双引号复制标记并发送给你的编译器

答案 4 :(得分:2)

-pendantic外,您还应提供-std转换。如果您需要更严格的编译,那么您应该知道您要遵循的标准。通常对于当前的c ++,这将是-std=c++98。 (-ansi在C ++模式下执行类似的功能,但-std=更明确。)

答案 5 :(得分:1)

在类似情况下,我们放弃并移至ACE framework,隐藏平台之间的差异。

答案 6 :(得分:1)

在研究了几个选项后,我在这个主题上写了the blog post。您还需要处理使用其他库但不遵循严格编译的情况。幸运的是,还有简单的方法来处理它们。我在我的所有项目中都广泛使用它。

简而言之,使用以下编译器选项打开非常严格的模式(下面是我放在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/