“atomic”和“cstdatomic”有什么区别?

10
请问一下 #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)

那么,cstdioiostream有什么区别呢?当然它们的功能基本相同,但一个是正统的C++,而另一个则是C语言的遗留。 - Christian Rau
2个回答

26

现有的答案都是错误的,大部分评论也是。

<cstdatomic> 不是任何标准中定义的头文件。

它在旧的 C++0x 草案中定义,但并没有出现在最终的 C++11 标准中,只有 <atomic>。所以它作为 GCC 4.4 实验性的 C++0x 支持的一部分被包含进来,但是后来在 C++0x 草案中改名了(这个改动在 2009 年由 N2992 完成)。

除非你被困在 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>

编辑:自从C++23开始,C++库中有一个<stdatomic.h>头文件,但仍然没有<cstdatomic>


2
支持参考:https://gcc.gnu.org/gcc-4.5/changes.html - 旧的头文件已经在GCC 4.5附带的libstdc++中更名为新名称。 - Phil Miller
Cppreference网站上没有显示任何接受普通整数的atomic_store和load函数,只有std::atomic的重载版本。这是否意味着在C++中我必须使用stdatomic.h来使用这些函数,而且它们是否在C++中可用? - Johannes Schaub - litb
@JohannesSchaub-litb <atomic> 提供了 std::atomic_storestd::atomic_load,但仅适用于操作 std::atomic(以及别名 std::atomic_int 等)。自从 C++23 之后,还有 <stdatomic.h>,它在全局命名空间中声明了这些函数。但是对于普通整数,从未提供过载函数,只有针对原子对象的函数。这在 C 和 C++ 中都是如此。如果您想在 C++ 中对普通整数执行原子操作,请使用 std::atomic_ref<int> 对其进行包装,然后使用 std::atomic_ref 的成员函数。 - Jonathan Wakely

8
<atomic>是C++的原子操作库。 <cstdatomic>是C的原子操作库的C++版本。
两者都可以提供例如std::atomic_char,但只有C++版本拥有std::atomic<T>
一般规则是,在C++中使用C头文件时,应删除扩展名.h并在名称前添加cstdatomic.h变成了cstdatomic。 这将把C头文件包含到命名空间std中。
还要注意,stdatomic.h(因此cstdatomic)是C11而atomic是C++11,这可能解释了编译器支持上的差异。

2
“反向通用规则”:一个看起来像 <cxxx> 的 C++ 头文件,很可能是 C 头文件 <xxx.h> 的 C++ 等效物。 :p - gx_
4
stdatomic.h 来自 C11 而非 C99。原子操作是由 C 和 C++ 标准委员会共同为 2011 年标准而开发的。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接