#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)
现有的两个答案都是错误的,大多数评论也是错误的。
<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>
对应的。
<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,这可能解释了编译器支持的差异。