簡體   English   中英

C ++ builder 2010中奇怪的“隨機”內部編譯器錯誤

[英]Strange “random” internal compiler error in C++ builder 2010

我有一些代碼將一堆TNotifyEvents放在一個向量中

std::vector<TNotifyEvent> m_availableCallbacks;

這是應用程序主要形式的成員。 在表單構造函數中,它充滿了事件。

m_availableCallbacks.push_back(ReadoutLastValue);
m_availableCallbacks.push_back(ReadoutCurrentDay);
m_availableCallbacks.push_back(ReadoutLastDay);
m_availableCallbacks.push_back(Readout7Days);
m_availableCallbacks.push_back(Readout1Month);
m_availableCallbacks.push_back(ReadoutChooseTimeSpan);
m_availableCallbacks.push_back(ReadoutAllData);

然后迭代此向量並用於創建彈出菜單並將通知事件分配給該彈出菜單中的元素。

在本地編譯這個沒有問題。 當我在構建服務器(運行TeamCity 6.5 )上編譯它時,我得到的行等於第二個push_back調用的內部編譯器錯誤。

我嘗試通過編輯cbproj文件在構建代理上本地禁用智能緩存預編譯頭 這產生了成功的構建。 所以我刪除了指令,使用來自所有cbproj文件的智能緩存預編譯頭文件並提交了更改。 我告訴TeamCity做一個Clean Checkout ,我又在同一個地方得到了相同的內部編譯器錯誤。 奇怪的是,在失敗的一個成功之后運行一個新的編譯,所以這感覺非常隨機。

到底是怎么回事? 我習慣於在其他C ++編譯器中傳遞函數指針(由我自己創建)。 TNotifyEvents的內部處理是否已損壞或編譯器是否不穩定且容易損壞?

看看其他采用TNotifyEvents的代碼,它們不能用於引用或指針,所以我沒有嘗試過。 並且因為代碼(當它編譯時)按預期工作似乎不是問題。

更新:

我可以補充一點, TeamCity的日志說當重新運行編譯時它會跳過 FrontEnd.cpp文件(包含此代碼),並且成功。

[10:04:37]: [MakeObjs] CallTarget
[10:04:37]:   [CallTarget] _CppDepCheck
[10:04:44]:     [_CppDepCheck] MessageMap
[10:04:44]:       [MessageMap] Skipping: ..., FrontEnd.cpp, ...

為此,即使工作,編譯必須在發生內部編譯器錯誤時成功。 它怎么可能會跳過編譯文件仍然神奇地出現並以編譯形式使用? :)

UPDATE2

經過調查,我可以確認只有在發布模式下進行編譯時才會發生這種情況。 在發布中,它甚至發生在IDE中的本地計算機上。 我試過擺弄像這樣的設置

  • 禁用所有優化
  • 盡可能生成最快的代碼
  • 外部類型文件
  • 等等

清理每次嘗試之間的構建。 但ICE並沒有消失。 然而,我確實設法讓它抱怨另一個文件中的另一個地方。 將設置恢復為之前的設置不會使錯誤返回到FrontEnd.cpp文件。 這個編譯器感覺有點不穩定:)

事實上,我開始在代碼中獲得ICE,並且必須重新啟動IDE以便能夠編譯任何內容。

這似乎與std :: vector有關 不確定它是單獨打破還是由bcc處理的方式是問題所在。 但是切換到C風格的數組作為測試使得ICE消失了,現在它在調試和發布模式下都能正常工作。

TNotifyEvent m_availableCallbacks[7];

我想避免這種情況,因為向向量添加新事件幾乎只涉及一行代碼。 現在還會有更多要記住改變。 但是,最好讓應用程序編譯。

如果我錯誤地認為這是BCC中的一個錯誤,請糾正我,以便我可以盡快回到使用向量:)...否則我希望Embarcadero盡快解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM