"原子"和"cstdatomic"有什么区别?

baa*_*aam 8 c++ atomic c++11

可有人请澄清差的包括选项 #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)

Jon*_*ely 18

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

<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>与之对应的库.

  • 支持参考:https://gcc.gnu.org/gcc-4.5/changes.html - 旧标头已移至 GCC 4.5 附带的 libstdc++ 中的新名称 (2认同)

sla*_*ppy 8

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

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

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

作为一般规则,C头应该用C++使用通过移除.h延伸和预先挂起c到名称:stdatomic.hcstdatomic.这将包括进入命名空间的C头std.

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

  • `stdatomic.h`来自C11,而不是C99.Atomics由C和C++标准委员会共同制定,用于2011标准. (3认同)
  • @baam "反向一般规则":一个C++头,看起来像`<CXXX>`可能是一个C头`<xxx.h>`的C++当量.:p (2认同)