18

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

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

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

4

7 回答 7

8

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

那里有一些工具:

他们会节省你很多时间。

于 2009-01-29T09:30:28.310 回答
3

您可以使用-pedantic-errors. 这将防止开发人员忽略它。就此而言,您也可以将所有警告都变成错误,-Werror尽管在某些情况下可能会适得其反(尽管可能不在您的情况下)。

总的来说,我认为,就遵守严格的标准而言,这些-pedantic选项是最有帮助的。

于 2009-01-29T07:20:53.553 回答
3

-迂腐错误

在gcc(1)上查看更多信息。

于 2009-01-29T07:21:56.373 回答
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,只需复制双引号中的标志并将它们发送到您的编译器。

于 2013-12-19T07:04:46.010 回答
2

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

于 2009-01-29T07:42:55.317 回答
1

在类似的情况下,我们放弃并转向了ACE 框架,隐藏了平台之间的差异。

于 2009-01-29T07:21:24.940 回答
1

在研究了几个选项后,我写了一篇关于这个主题的博客文章。您还需要处理使用其他库但它们没有遵循严格编译的情况。幸运的是,还有一种简单的方法来处理它们。我一直在我的所有项目中广泛使用它。

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

于 2017-07-11T23:48:30.553 回答