2013-06-19 182 views
7

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

+0

那么'cstdio'和'iostream'有什么区别?当然,它或多或少具有相同的功能,但一个是适当的C++,另一个是C遗产。 –

回答

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

+0

感谢您的解释。 – baam

+2

@baam“反向通用规则”:看起来像“”的C++头可能是C头文件''的C++等价物。 :p –

+3

'stdatomic.h'来自C11,而不是C99。 Atomics由C和C++标准委员会为2011年标准共同开发。 –

15

这两个现有的答案都是错误的,大多数评论也是如此。

<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>

+1

支持参考:https://gcc.gnu.org/gcc-4.5/changes.html - 旧头文件被移至GCC 4.5附带的libstdC++中的新名称 – Novelocrat