2012-04-11 25 views
4

我們懷疑是在我們的代碼這樣的事情,如何找到一個懸空的命名空間或預處理指令在一個巨大的代碼庫

所以也許一個#ifdef沒有#endif或者一個命名空間富{沒有},什麼是一些在具有數十萬個文件的代碼庫中定位這種事情的策略,是否有使用正則表達式的方法?

編輯 - 忘了提(這是真正的邪惡部分)有就是我們所說的這段代碼中的每一個CPP文件提取到一個超級大的cpp文件生成統一的文件。因此編譯器可能不會錯過括號或不匹配的其他/ IFS,因爲他們可以很容易地運行在進入下一個幾百萬行代碼報告...

+0

好問題...這已經困擾了很多年的程序員。聽起來好像是該走出紅牛的時候了。 – 2012-04-11 13:07:47

+0

我在非常高的辦公室工作...... – SirYakalot 2012-04-11 13:09:24

+0

您是否收到編譯錯誤? – 2012-04-11 13:10:15

回答

1

正則表達式真的不能找到匹配的括號,特別是如果他們是嵌套的。

在我看來,最好的辦法是確保所有的代碼都是正確的縮進,那麼很容易看到的東西丟失時。

除此之外,它與兩端的手工勞動匹配的開端。希望它只需要很少做。另請注意,大多數適用於編碼的現代文本編輯器都非常擅長匹配諸如括號和括號之類的內容。

1

編譯器和預處理器抱怨不匹配的#if/#endif對或不匹配的大括號。找到編譯器所抱怨的第一個文件,並手動「修改」它直到編譯完成。

(不,標準的正則表達式不能匹配嵌套到任意深度對。)

0

這是不以任何方式一個完整的答案,但我沒發現它有助於使用正則表達式:

// *\#if|\#el|\#en

搜索//後跟任意數量的空白(包括無),然後是#if,#el或#en(排除拋出所有雜注等的可能性 - 這絕對可以改進。

幸運的是,我只需要在我的公開文檔中搜索,這是幾百個,但它可能會變得更糟。希望這有助於未來的人,這太可怕了!

1

如何找到一個巨大的代碼庫

在Visual Studio中按Ctrl+]懸掛命名空間或預處理指令將導致光標跳轉到匹配的括號或ENDIF語句。當你找到一個光標不能跳躍的大括號時,它就是「懸掛」。另外,您可以摺疊代碼的一部分,這可以幫助您找到不匹配的大括號。

我還建議閱讀實際的編譯器輸出,而不是錯誤列表。

用的文件數十萬

在第一個錯誤終止彙編,調查文件導致錯誤,修正錯誤,請嘗試重新編譯。一次編譯一個文件,使用「編譯」而不是「編譯解決方案」。 「詢問」編譯器生成包含插入文件的輸出列表(VS2008 cl.exe中的/ E或/ P開關),然後調查生成的文件。

如果這樣也行不通,你將不得不花一些時間來編寫一個用python/perl編寫的小解析器 - 這個解析器會檢查匹配的大括號。

0

答案是不會(有效地)將100000個文件粘貼到一個文件中,以便每個文件編譯時編譯器馬上就會知道存在某些不匹配的結果。然後,使用生成的錯誤消息和正常代碼檢查來查找缺少的指令或大括號應該是微不足道的。

+0

是啊我同意!但是把它告訴給主要遊戲工作室的人 - arghargarghghghhggh! – SirYakalot 2012-04-11 15:32:55

1

兩個步驟:

  1. 使用常規的版本(不是一個可怕的統一版本)定位錯誤
  2. 如果你的編譯器不趕用適當的標誌錯誤,切換到另外一個

請注意,使用智能編譯器,即使使用統一構建,它也可以工作。

-Wscope與Clang一起使用,如果作用域(例如命名空間)在文件(如標頭)中啓動但不會在此處結束,則會發出警告。引入此修補程序的修補程序可在the mailing list上找到。它將在3.1版本中提供。

我不認爲在Clang中有預處理指令的等價物。

0

這可能與您的問題沒有關係,但在#if /#else /#endif塊中構建某些頭文件時,出現「Unexpected#else」錯誤。

我發現如果我將問題模塊設置爲不使用預編譯頭文件,問題就消失了。與「#pragma hdrstop」有關的內容不應該在#if /#endif內。

相關問題