首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在用于C++14客户端应用程序的库中使用C++11吗?

我可以在用于C++14客户端应用程序的库中使用C++11吗?
EN

Stack Overflow用户
提问于 2015-09-25 17:03:40
回答 1查看 4.6K关注 0票数 13

如果我正在构建一个库,假定库的某些“客户端”可能只使用C++11,那么我可以使用C++14来编译库本身吗?与C++11相比,是否存在API/ABI/link兼容性问题?只要我避免公共API中的某些新特性,用C++14实现和构建库安全吗?如果是的话,我必须避免什么?还是在最终的软件项目中混合C++11和C++14本质上是不兼容的?

它是一个跨平台的库,BTW,所以我需要在Linux、OSX和Windows上构建它。

EN

回答 1

Stack Overflow用户

发布于 2016-07-22 11:49:13

如果我正在构建一个库,假定库的某些“客户端”可能只使用C++11,那么我可以使用C++14来编译库本身吗?

是的,一般来说,这应该是可能的。

我正是这样做的GCC的文件系统TS的实现。<experimental/filesystem>头是用纯C++11编写的,可以由C++11客户端包含,但是libstdc++fs.a中的实现是用C++14编写的。

与C++11相比,是否存在API/ABI/link兼容性问题?

C++11和C++14之间没有任何需要实现破坏其链接时间兼容性的更改。这并不意味着实现不会破坏它,但它们并不是必需的。

对于GCC来说,我相信C++11和C++14完全兼容API和ABI,除了下面提到的constexpr和大小分配问题之外。

只要我避免公共API中的某些新特性,用C++14实现和构建库安全吗?如果是的话,我必须避免什么?

这取决于您的编译器,但理论上是可能的。

显然,要避免在C++14中无效的任何C++11语言特性(例如函数返回类型推断、带有auto参数的泛型lambdas或变量模板)和任何C++14库实体,如std::make_uniquestd::integer_sequence, orstd::shared_timed_mutex`。

C++14中几乎所有更改的列表都可以在SD-6中找到。

需要注意的一点是,非静态constexpr成员函数的含义在C++11和C++14之间发生了变化。

代码语言:javascript
运行
复制
struct X {
  constexpr int foo();
};

在C++14中它是非连续的.要与C++11和C++14兼容,您应该显式地将其限定为const

代码语言:javascript
运行
复制
struct X {
  constexpr int foo() const;
};

在C++11和C++14中,这都意味着同样的事情。

另一个警告是,在C++11和C++14中,这个运算符的含义不同:

代码语言:javascript
运行
复制
void operator delete(void*, std::size_t);

如果C++11客户端代码定义了该函数,那么在C++14中编译的库最终可能会调用它而不是通常的operator delete(void*),这可能会做错误的事情。这可能很少见,在实际代码中也不是问题,但这是可能的。G++和Clang允许您使用-fno-sized-deallocation编译C++14代码以禁用新特性,这样您的C++14库代码就不会调用该版本的operator delete

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32787244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档