2009-01-29 62 views
17

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

我的目标是更加严格地编译GCC,并在所有平台上捕获更多错误,以便我们不会遇到这些问题。这是我说我想尝试的GCC标志的名单,我已经通过谷歌和GCC手册页发现:

  • -Wall
  • -Wextra
  • -Winit自
  • -WOLD式铸造
  • -Woverloaded虚拟
  • -Wuninitialized
  • -Wmissing申述
  • -Wini T-自
  • -ansi
  • -pedantic

什么是人使用,使GCC(以及同样重要的是Visual Studio的C++和英特尔C++编译)其他标志服从℃的严格标准++语言?请具体说明您正在讨论的编译器和版本,因为其中一些编译器和版本可能无法在所有版本的所有编译器中实现。

回答

8

除了其他人提出的迂腐错误,IMO,运行lint作为编译过程的一部分总是很好。

还有那里的一些工具:

他们将节省大量的时间。

+0

有很多商业工具可用:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#C.2FC.2B.2B。如果你想投资一个商业工具,你通常可以得到试用版/评估版。 – 2009-01-29 10:56:56

3

您可以用-pedantic-errors将迂腐警告写入错误。这会阻止开发人员忽略它。对于这个问题,您可以将所有警告都写入错误中,尽管在某些情况下这可能会产生反作用(尽管可能不会)。总体而言,我认为,只要遵守严格的标准,-pedantic选项是最有帮助的。

1

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

3

-pedantic-errors。

查看更多关于gcc(1)

2

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

+0

还要注意-ansi和-std = C++ 11相互冲突,导致C++ 98而不是C++ 11。 – pilkch 2016-08-24 23:11:17

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的直接复制,在双引号,发送给你的编译器

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/