繁体   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