“原子”和“cstdatomic”有什么区别?

时间:2013-06-19 07:51:01

标签: c++ c++11 atomic

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

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

我问这个是因为在我的debian系统上我只得到了原子,而且在我的kubuntu系统中我得到了cstdatomic。

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

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

2 个答案:

答案 0 :(得分:17)

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

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

它是在旧的C ++ 0x草案中定义的,但不在最终的C ++ 11标准中,只有<atomic>。所以它被作为GCC 4.4的实验性C ++ 0x支持的一部分包含在内,但是当它在C ++ 0x草案中重命名时(在2009年由N2992完成)后重命名为以后的版本。 / p>

除非你遇到GCC 4.4并且乐于使用C ++ 11原子的不完整和错误版本,否则不应该使用<cstdatomic>。 (我不知道为什么Kubuntu的GCC 4.6包含标题,它不在上游GCC 4.6版本中,它必须是Ubuntu或Kubuntu或Linaro补丁。)

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

<stdatomic.h>是C11标头,但C ++ 11库基于C99库,因此不包含<stdatomic.h>,并且不提供与其对应的<cstdatomic>

答案 1 :(得分:8)

<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,这可能解释了编译器支持的差异。