C++ 异常二进制兼容性

2023-12-22

我的项目使用 2 个不同的 C++ 编译器,g++ 和 nvcc(cuda 编译器)。 我注意到 g++ 对象文件中没有捕获从 nvcc 对象文件抛出的异常。

C++ 异常应该在同一台机器上二进制兼容吗? 什么会导致这种行为?

try { kernel_= new cuda:: Kernel(); }
catch (...) { kernel_= NULL; }

// nvcc object
cuda:: Kernel:: Kernel () {
  ...
  if (! impl_) throw;
}

其他一切似乎都有效(C++ 对象、运算符)。老实说,我不太了解异常,所以上面的代码可能有错误。


很抱歉在一个晚上给您两个“否”答案,但是“否”,C++ 异常(或与此相关的类)没有标准的二进制布局。尝试在两个不同的编译器之间使用 C++ 类/异常会破坏一种定义规则 http://en.wikipedia.org/wiki/One_Definition_Rule.

您可以通过仅允许目标文件之间存在 C API 来解决此问题(因为 Chas标准 ABI(应用程序二进制接口),或者您可以使用一种编译器或另一种编译器来编译所有代码。不过,我不确定最后一点是否可以通过 NVCC 实现。

回答问题编辑:其他一切似乎都有效(C++ 对象、运算符): 有很多东西seem在绝大多数情况下都可以工作。这并不意味着它们不会调用未定义的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 异常二进制兼容性 的相关文章

随机推荐