2010-04-07 32 views
24

有誰知道我可以用來在代碼中查找明確的C風格演員的工具?我正在重構一些C++代碼,並希望儘可能地替換C風格的演員。用於查找C風格演員的工具

一個例子C樣式轉換將是:

Foo foo = (Foo) bar; 

在C的對比實例++風格的轉換將是:

Foo foo = static_cast<Foo>(bar); 
Foo foo = reinterpret_cast<Foo>(bar); 
Foo foo = const_cast<Foo>(bar); 
+0

什麼是C式演員? – 2010-04-07 14:14:55

+1

括號中的類型,例如。 (int)f – AshleysBrain 2010-04-07 14:16:38

+1

@Bears(int)x例如。 – 2010-04-07 14:17:41

回答

29

如果你使用GCC/G ++,剛啓用的C風格的警告轉換:

g++ -Wold-style-cast ... 
+5

+1使用最好的工具和最簡單的方法來完成這項工作...如果這是可行的。 – 2010-04-07 15:05:41

8

,這種石膏是如此難以搜索是一個事實首先介紹了新式演員的原因。如果你的代碼正在工作,這看起來像是一個毫無意義的重構 - 我只需修改周圍的代碼就可以將它們更改爲新的類型。儘管如此,在C++代碼中你完全擁有C風格轉換的事實將表明應該修復代碼的問題 - 即使這是可能的,我也不會僅僅進行全局替換。

+0

我必須遵守編碼準則:) – waffleman 2010-04-07 14:17:20

+0

大多數情況下,這些準則適用於輸入新代碼。舊代碼只會在需要更改時重構。例如修復。僅僅爲了重構而重構僅僅花時間(和金錢)而沒有任何好處。 – RvdK 2010-04-07 14:57:21

+0

+1在修改/重構周圍代碼時(可能重新測試)會修復它們。 – 2010-04-07 15:15:01

5

尋找正則表達式\)\w可以獲得驚人的好結果。

+1

正是我在想什麼! http://xkcd.com/208/ – ewall 2010-04-07 14:31:55

+2

這隻有在你把變量放在變量旁邊時纔有效......你應該始終這樣做,但不是每個人都這麼做。 – 2010-04-07 17:56:28

0

C風格演員陣容的一個問題是,因爲他們依賴於方式超負荷的括號,他們不是微不足道的斑點。儘管如此,一個正則表達式,例如(例如在Python語法):

r'\(\s*\w+\s*\)' 

是一個開始 - 它與括號內可選空白括號單個標識符相匹配。但是,當然,這不會趕上,例如,(void*)鑄 - 讓尾隨星號,以及,

r'\(\s*\w+[\s*]*\)' 

你也可以開始一個可選const進一步拓寬網尚,等等,等等

一旦你有一個很好的RE,許多工具(從grepvim,從awksed,加上perlpythonruby等),可讓您將它識別源所有的比賽。

0

如果您使用某種匈牙利風格的符號(例如iIntegerpPointer等),那麼您可以搜索例如)p) p等。

即使對於大型代碼庫,也應該可以在合理的時間內找到所有這些地方。

1

一個工具,可以準確地分析C++源代碼並執行自動化的自定義更改(例如,您的演員替換)是DMS Software Reengineering Toolkit

DMS擁有一個完整的C++解析器,可以構建AST和符號表,並且可以導航您的代碼以可靠地查找C風格轉換。通過使用模式引導匹配和重寫,您可以提供一組規則,將所有這些C風格的轉換轉換爲您所需的C++等價物。

DMS已被用於爲波音和通用動力公司執行大規模自動化C++重新設計任務,每項任務涉及數千個文件。

+8

當您插入自己的產品時,您應該事先說清楚。 – 2010-04-07 14:38:07

6

Offload C++ compiler支持作爲編譯時錯誤報告所有此類強制轉換的選項,並將這些強制轉換的語義限制爲與static_cast更安全等效。

相關的選項有:

-cp_nocstylecasts 

編譯器將所有的C-風格轉換髮出一個錯誤。 C++代碼中的C風格轉換可能會不安全,並導致不需要的或未定義的行爲(例如將指針指向不相關的結構/類類型)。此選項對於重構來查找所有這些強制轉換並將其替換爲更安全的C++強制轉換(如static_cast)非常有用。

-cp_c2staticcasts 

編譯器將C++ static_cast的受限制語義應用於C風格強制轉換。使用此選項打開編譯代碼可確保C風格轉換至少與C++一樣安全static_casts

如果現有代碼具有大量C風格轉換並將每個轉換重構爲C++轉換,此選項非常有用太多的努力。

+0

噢,真好!一次真正的解析器:) – 2010-04-07 14:42:15

0

我已經與工具的描述回答一次,將發現和變化所有類型轉換如果你想要它。

如果你想要做的就是找到這樣石膏,還有另一種工具,將很容易地做到這一點,其實是這裏的所有的「正則表達式」的建議極端的泛化。那是SD Source Code Search Engine。該工具使人們能夠根據構成每種語言的語言元素搜索大型代碼庫。它提供了一個圖形用戶界面,允許您輸入查詢,查看單個命中,並通過單擊一次鼠標在命中點顯示文件文本。再次點擊一下,你可以在你的編輯器中[對於許多編輯]在文件上。該工具還會在上下文中記錄點擊列表,以便稍後再次訪問它們。

在你的情況,下面的搜索引擎查詢可能得到大多數鑄件:

'(' I ')' | '(' I ... '*' ')' 

這意味着,找到標記序列,第一個是(,第二個是任何標識,第三個是「 )',或者包含以'*'結尾的類似的序列。

您不指定任何空白管理,因爲該工具理解語言空白規則;它甚至會忽略演員陣容中的評論,並且仍然與上述相符。

[我的首席技術官供應該公司]

-1

我以前在Visual Studio(2010年),這個正則表達式查找文件搜索框::i\):i

感謝某事物爲靈感(his post