2009-01-29 84 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/