【问题标题】:What's the difference between "atomic" and "cstdatomic"?“原子”和“cstdatomic”有什么区别?
【发布时间】:2013-06-19 07:51:00
【问题描述】:

有人可以澄清一下包含选项之间的区别吗 #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)

【问题讨论】:

  • 那么,cstdioiostream 有什么区别?当然,它或多或少是相同的功能,但一个是正确的 C++,另一个是 C legacy。

标签: c++ c++11 atomic


【解决方案1】:

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

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

它是在旧的 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>

【讨论】:

【解决方案2】:

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

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

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

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

还要注意stdatomic.h(因此cstdatomic)是C11,atomic是C++11,这可能解释了编译器支持的差异。

【讨论】:

  • @baam "反向一般规则":看起来像 <cxxx> 的 C++ 标头可能是 C 标头 <xxx.h> 的 C++ 等效项。 :p
  • stdatomic.h 来自 C11,而不是 C99。 Atomics 由 C 和 C++ 标准委员会针对 2011 年标准联合开发。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2013-05-21
  • 2013-04-10
  • 2014-03-24
  • 2018-03-17
相关资源
最近更新 更多