回答
GCC有選項-Wold-style-cast
,如果它發現任何C風格的轉換,它會發出警告。
我不知道編譯器開關報告了這些或Visual Studio中內置的任何其他內容。
但是,這裏是一個Perl script,它將搜索源代碼樹並查找源代碼中的所有C風格轉換。它可以很好地追蹤它們。
不幸的是,在Visual C++中沒有指出這些強制轉換的編譯器警告(至少不是我所知道的),雖然它看起來像PC-Lint的確會提供一個警告/一個古老的演員。取決於你是否願意花錢在PC-Lint上 - 在我看來,它絕對值得你用它找到的所有問題......
你爲什麼需要這個?你想擺脫所有這些嗎?
基本類型的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風格的人更好的和更安全的 。但它 並不意味着你需要在你的代碼中搜索 舊的,並嘗試去掉所有這些。其實,這不是一個真正的問題。只是不要浪費你的時間。你可能花費在搜索和刪除一些過時的代碼。這對你的代碼庫更有用。
雖然它可能像static_cast一樣工作,但問題在於,當您更改一些周圍的代碼時,它可能會默默地切換到像reinterpret_cast一樣工作。問題是您沒有正確表達您想要的內容,編譯器可以自由執行任何演員是最合適的演員一些周圍的代碼,你的C-cast會改變它的含義並破壞你的代碼。 當然,獎金問題是這個問題的主題:他們不可能搜索。無法找到您使用的演員,特別是當他們非常容易出錯時,有點尷尬。 – jalf 2009-08-18 13:32:12
最後,它是*故意*,他們是醜陋的。演員*是一個醜陋的伎倆。他們應該看起來很醜,明確表明他們正在發生,並勸阻你過度使用它們。 ;) – jalf 2009-08-18 13:32:43
這個問題,用戶在他的代碼中找不到轉換,是支持C++風格轉換的一個原因。 – JohnMcG 2009-08-18 20:20:32
- 1. 將ruby源代碼從舊風格轉換爲新風格hash
- 2. C++的類型轉換風格
- 3. C類型轉換的替代方法?
- 4. C++到C#代碼轉換類型
- 5. 如何將Linux C++源代碼轉換爲Windows C++源代碼?
- 6. C#查找並替換
- 7. C數據類型轉換
- 8. 在C#中替換並替換爲Java中的所有
- 9. 在C#中,如何自動測試Word查找/替換代碼?
- 10. 錯誤:從整型轉換爲指針類型需要reinterpret_cast,C風格轉換或函數風格轉換
- 11. 在C文件中查找並替換
- 12. 我如何轉換爲C#中的不同數據類型
- 13. 替換並替換所有C#窗體表格
- 14. 如何將C++聯合類型轉換爲C#代碼?
- 15. C風格的字符串查找和替換功能
- 16. 轉換數據類型之間的C#
- 17. C++中的類型轉換
- 18. C#中的類型轉換#
- 19. 轉換從C#風格的泛型類型定義字符串CLR風格
- 20. 轉換C++代碼轉換爲C#:SendMessageTimeout()
- 21. 如何將C++代碼轉換爲iphone中的Objective C代碼?
- 22. 查找並與目標C大文件替換,替換計數
- 23. c#word interop查找並替換所有內容
- 24. 如何將C#代碼轉換爲C++
- 25. 如何將C#代碼轉換爲C++?
- 26. C++到C#代碼轉換,參考與值類型的麻煩
- 27. 理解C風格類型轉換和動態轉換的困難
- 28. C++代碼命名風格轉換,格式化或美化
- 29. 在C++類中包裝C類庫,並進行類型轉換
- 30. 將Java源代碼轉換爲C++源代碼的工具
但是我使用Visual C++(MFC):( – 2009-08-15 10:54:13
您可能要檢查的Visual C++編譯器開關,看看是否有一個關閉這個警告,或者如果他們有一個你可以指定禁用某些警告 如果沒有這樣的開關,可以在導致進攻的文件中用一個雜注禁用警告。我已經與Visual C++配合使用,在編譯時禁用一些關於STL名稱長度的警告。 – Glenn 2009-08-18 13:28:57