9

#include <atomic>有人可以澄清包含选项和之间的区别 #inlucde <cstdatomic>吗?

我猜没有,因为它的行为相同?

我问这个是因为在我的 debian 系统上我只有 atomic,而在我的 kubuntu 系统上我有 cstdatomic。

  • Debian 上的编译器:版本 4.7.2 (Debian 4.7.2-4)

  • Kubuntu 上的编译器:版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

4

2 回答 2

23

现有的两个答案都是错误的,大多数评论也是错误的。

<cstdatomic>不是任何标准中定义的标头。

它是在旧的 C++0x 草案中定义的,但不在最终的 C++11 标准中,只有<atomic>。因此它被包含在 GCC 4.4 的实验性 C++0x 支持中,但随后在 C++0x 草案中重命名(由N2992于 2009 年完成)后重命名为后续版本。

<cstdatomic>除非您坚持使用 GCC 4.4 并且乐于使用不完整且有缺陷的 C++11 原子版本,否则您不应该使用。(我不知道为什么 Kubuntu 的 GCC 4.6 包含头文件,它不在上游 GCC 4.6 版本中,它必须是 Ubuntu 或 Kubuntu 或 Linaro 补丁。)

<atomic>是标准 C++11 标头,您可以依赖它来实现任何合理符合 C++11 的实现。

<stdatomic.h>是C11的头文件,但是C++11库是基于C99库的,所以不包含<stdatomic.h>也不提供<cstdatomic>对应的。

于 2014-12-06T15:37:13.397 回答
7

<atomic>是 C++ 原子操作库。

<cstdatomic>是 C 原子操作库的 C++ 版本。

两者都会给你例如,std::atomic_char但只有 C++ 版本有std::atomic<T>.

作为一般规则,应在 C++ 中使用 C 头文件,方法是删除.h扩展名并c在名称前添加:stdatomic.h成为cstdatomic. 这会将 C 标头包含到命名空间std中。

还要注意stdatomic.hcstdatomic因此)是 C11 和atomicC++11,这可能解释了编译器支持的差异。

于 2013-06-19T07:56:39.563 回答