【问题标题】:Is it possible to use C++11 ABI _and_ both cxx11-style and old-style strings?是否可以同时使用 C++11 ABI _and_ cxx11-style 和 old-style 字符串?
【发布时间】:2016-06-03 21:19:31
【问题描述】:

我有一些使用 GCC 5.3.1 构建的代码,没有设置 _GLIBCXX_CXX11_ABI。现在,假设我想在同一段代码中同时使用旧式和新式std::__cxx11::string。那可能吗?如果有,怎么做?

注意事项:

  • 我真的没有充分的理由这样做。我确实有一个不太好的理由,但请让我们把它变成一个理论问题。
  • C++11 字符串不叫std::string 也没关系。

【问题讨论】:

标签: c++ c++11 gcc stdstring abi


【解决方案1】:

你能在同一代码中同时拥有旧的和新的string 实现吗?不完全是。 Almighty Manual 声明:

ABI 过渡添加了几个组件的新实现,使用 abi_tag 属性和 __cxx11 内联命名空间 区分新实体和旧实体。

  • 可以通过_GLIBCXX_USE_CXX11_ABI 宏选择按翻译单元使用新的或旧的 ABI。

  • 新的非引用计数字符串实现。

现在您理论上可以使用-D_GLIBCXX_USE_CXX11_ABI=0 进行编译并使用ext/vstring.h,这是在破坏性ABI 更改之前GCC 的一致字符串实现。不过,如果事情发生了,我不会感到惊讶。

【讨论】:

  • 等等,这不是矛盾吗?我的意思是,vstring 是旧的实现,-D_GLIBCXX_USE_CXX11_ABI=0 会给我旧的实现std::string。还是我错了?
  • @einpoklum 不,写时复制是旧的字符串实现,“非引用计数”是新的(又名vstring。我的意思是没有理由在 C++11/新 ABI 中使用 vstring)。
猜你喜欢
  • 2019-11-06
  • 2018-06-14
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2023-03-31
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多