有人可以澄清包含选项之间的区别
#include <atomic>
和#inlucde <cstdatomic>
?
我猜测没有,因为它的行为相同?
我问这个是因为在我的debian系统上我只得到了原子,而且在我的kubuntu系统中我得到了cstdatomic。
编译器:版本4.7.2(Debian 4.7.2-4)
编译器:版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)
答案 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,这可能解释了编译器支持的差异。