有人可以澄清包括选项 #include <atomic>
和#inlucde <cstdatomic>
之间的区别吗?“原子”和“cstdatomic”有什么区别?
我猜测没有,因为它有相同的行为?
我这样问,因为在我的debian系统上,我只有原子,并在我的kubuntu系统上有cstdatomic。
编译器在Debian:版本4.7.2(Debian的4.7.2-4)
编译器上的Kubuntu:版本4.6.3(Ubuntu的/ Linaro的4.6.3-1ubuntu5)
有人可以澄清包括选项 #include <atomic>
和#inlucde <cstdatomic>
之间的区别吗?“原子”和“cstdatomic”有什么区别?
我猜测没有,因为它有相同的行为?
我这样问,因为在我的debian系统上,我只有原子,并在我的kubuntu系统上有cstdatomic。
编译器在Debian:版本4.7.2(Debian的4.7.2-4)
编译器上的Kubuntu:版本4.6.3(Ubuntu的/ Linaro的4.6.3-1ubuntu5)
<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
@baam“反向通用规则”:看起来像“
'stdatomic.h'来自C11,而不是C99。 Atomics由C和C++标准委员会为2011年标准共同开发。 –
这两个现有的答案都是错误的,大多数评论也是如此。
<cstdatomic>
不是在任何标准中定义的标头。
它在旧的C++ 0x草案中定义,但不在最终的C++ 11标准中,只有<atomic>
是。所以它作为GCC 4.4的实验性C++ 0x支持的一部分被包含,但随后在C++ 0x草稿中重新命名(在2009年由N2992完成)后重新命名。
您不应该使用<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++中的新名称 – Novelocrat
那么'cstdio'和'iostream'有什么区别?当然,它或多或少具有相同的功能,但一个是适当的C++,另一个是C遗产。 –