2009-08-13 56 views

回答

24

GCC有選項-Wold-style-cast,如果它發現任何C風格的轉換,它會發出警告。

+0

但是我使用Visual C++(MFC):( – 2009-08-15 10:54:13

+0

您可能要檢查的Visual C++編譯器開關,看看是否有一個關閉這個警告,或者如果他們有一個你可以指定禁用某些警告 如果沒有這樣的開關,可以在導致進攻的文件中用一個雜注禁用警告。我已經與Visual C++配合使用,在編譯時禁用一些關於STL名稱長度的警告。 – Glenn 2009-08-18 13:28:57

7

我不知道編譯器開關報告了這些或Visual Studio中內置的任何其他內容。

但是,這裏是一個Perl script,它將搜索源代碼樹並查找源代碼中的所有C風格轉換。它可以很好地追蹤它們。

6

不幸的是,在Visual C++中沒有指出這些強制轉換的編譯器警告(至少不是我所知道的),雖然它看起來像PC-Lint的確會提供一個警告/一個古老的演員。取決於你是否願意花錢在PC-Lint上 - 在我看來,它絕對值得你用它找到的所有問題......

-9

你爲什麼需要這個?你想擺脫所有這些嗎?

基本類型的C型鑄件如(double)是安全的,看起來比static_cast<double>()好得多。我個人更喜歡這種風格。

在多態類的情況下,C風格轉換的問題被大大誇大了imho。只有使用多重繼承並且必須進行交叉轉換時,這可能會成爲問題。默認情況下,C風格的強制轉換在那裏不起作用。但在大多數情況下,()的工作原理與static_cast<>()完全相同,我不會浪費時間來更換它們。無論如何,對於多態類型,我在編寫新代碼或更改某些內容時使用C++風格的轉換。

UPDATE:

傢伙,看來我沒有這麼明確地表達我的意見。是的,我知道這個理論:C++ - 演員是好的,C演員是邪惡的。這條規則(和大多數其他規則)需要從C++中保存新手。但這並不意味着你總是需要遵循它。

我的觀點是C風格的演員陣容並不那麼可怕。如果你寫一些功能如

int convertFooToBar(double i_foo) 

,沒有理由在實現中使用C++風格的強制轉換。他們並不比(int)安全,但看起來很凌亂。在這種情況下鑄造並不棘手。在鑄造中完全沒有壞處或棘手:有時演員是天生的。

關於搜索:我不記得我在尋找過去10年裏的任何演員陳述,儘管我每天都在維護數百萬行遺留C++代碼。我什至不記得任何由於錯誤鑄造造成的嚴重問題。

原始問題是關於替換已經寫好的C風格演員。所以,我的回答是:

是的,C++ - 風格轉換比C風格的人更好的和更安全的 。但它 並不意味着你需要在你的代碼中搜索 舊的,並嘗試去掉所有這些。其實,這不是一個真正的問題。只是不要浪費你的時間。你可能花費在搜索和刪除一些過時的代碼。這對你的代碼庫更有用。

+6

雖然它可能像static_cast一樣工作,但問題在於,當您更改一些周圍的代碼時,它可能會默默地切換到像reinterpret_cast一樣工作。問題是您沒有正確表達您想要的內容,編譯器可以自由執行任何演員是最合適的演員一些周圍的代碼,你的C-cast會改變它的含義並破壞你的代碼。 當然,獎金問題是這個問題的主題:他們不可能搜索。無法找到您使用的演員,特別是當他們非常容易出錯時,有點尷尬。 – jalf 2009-08-18 13:32:12

+14

最後,它是*故意*,他們是醜陋的。演員*是一個醜陋的伎倆。他們應該看起來很醜,明確表明他們正在發生,並勸阻你過度使用它們。 ;) – jalf 2009-08-18 13:32:43

+10

這個問題,用戶在他的代碼中找不到轉換,是支持C++風格轉換的一個原因。 – JohnMcG 2009-08-18 20:20:32