2011-02-18 96 views
7

這是我嘗試啓動一個通常不會遇到的GCC特殊功能的集合。這來自中提到的「有效的C++」爲-g選項++的另一個問題@jlebedev後,GCC隱藏/鮮爲人知的功能

-WeffC++ 此選項發出警告,打破一些在書本「有效的C++」,並給出了編程指南「C++代碼更有效的C++「由Scott Meyers撰寫。例如,如果使用動態分配內存的類沒有定義複製構造函數和賦值運算符,將給出警告。請注意,標準庫頭文件不遵循這些準則,因此您可能希望將此選項用作偶爾測試自己代碼中可能出現的問題,而不是一直進行編譯。

還有其他很酷的功能嗎?

回答

1

返回值(例如int)的函數將返回一個隨機值,如果遵循的代碼路徑結束函數而沒有「返回值」語句。不注意這可能會導致異常和超出範圍的內存寫入或讀取。

例如,如果使用函數來獲取數組中的索引,並且使用了錯誤的代碼路徑(不以「返回值」語句結束的那個),那麼會返回一個隨機值可能會像索引到數組那樣太大,導致各種令人頭疼的問題,因爲您錯誤地弄亂了堆棧或堆。

5

我經常瀏覽當前的GCC/G ++命令行參數文檔,並更新我的編譯器腳本,使其更加偏執於任何類型的編碼錯誤。 Here it is如果你有興趣。

不幸的是,我沒有記錄它們,所以我忘記了大部分,但是 - 泛型,-Wall,-Wextra,-WeffC++,-Wshadow,-Wnon-virtual-dtor,-Wold-style-cast,-Woverloaded-virtual ,還有其他一些東西總是有用的,告訴我潛在的危險情況。我喜歡這種可定製的方面,它迫使我寫出乾淨,正確的代碼。它給了我很好的服務。

然而,他們並非沒有頭痛,尤其是-WeffC++。舉幾個例子:

  • 它需要我提供一個自定義的拷貝構造函數和賦值操作符,如果我的類中有指針成員,這是因爲我使用垃圾回收而無用。所以我需要聲明它們的空私有版本。
  • 我NonInstantiable類(這可以阻止任何的子類的實例),必須實現一個虛擬的私人朋友類,所以G ++不抱怨「只有私有構造函數且沒有朋友」
  • Final<T>類(這可以阻止的T子類,如果T實際上是從它派生而來的)不得不將T包裝在一個私有包裝類中,以將其聲明爲朋友,因爲標準平坦禁止與模板參數友好。
  • G ++識別永不返回返回值的函數,而是拋出一個異常,並聲明它們沒有用noreturn屬性聲明。隱藏在真正的指示背後並不奏效,G ++太聰明並且認可了它們。花了我一段時間想出一個變量volatile並將其與它的值進行比較,以便能夠毫無阻礙地拋出異常。
  • 浮點比較警告。天啊。我必須通過編寫x < = y和x> = y而不是x == y來解決這些問題。
  • 影子虛擬。好的,這對於防止子類中的愚蠢陰影/超載問題顯然是有用的,但仍然很煩人。
  • 沒有先前的函數聲明。只要我開始在其上面拷貝功能聲明,就會失去它的重要性。

這可能聽起來有點受虐狂,但作爲一個整體,這些非常酷的功能增加了我對C++和一般編程的理解。

G ++還有哪些很酷的功能?好吧,它是免費的,開放的,它是最廣泛使用的現代編譯器之一,它始終勝過其競爭對手,幾乎可以吃到任何人投擲的東西,幾乎可以在任何平臺上使用,可定製到地獄,持續改進,擁有廣泛的社區 - 什麼是不喜歡?