提问人:konsolas 提问时间:9/3/2023 更新时间:9/3/2023 访问量:71
将 _Atomic(type) 转换为 type
Converting _Atomic(type) to type
问:
请考虑以下 C 代码:
#include <stdatomic.h>
struct _opaque;
typedef struct _opaque *opaque;
struct container { _Atomic opaque x; };
struct container get_container();
void consume_opaque(opaque);
void test() {
consume_opaque(get_container().x);
}
这无法编译 (Clang 16),并出现以下错误:
error: passing '_Atomic(opaque)' to parameter of incompatible type 'opaque' (aka 'struct _opaque *')
此代码仍然无法编译,即使在尝试显式转换参数后也是如此: 。(opaque) get_container().x
相比之下,请考虑以下几点:
#include <stdatomic.h>
struct _opaque;
typedef struct _opaque *opaque;
struct container { _Atomic opaque x; };
struct container *get_container();
void consume_opaque(opaque);
void test() {
consume_opaque(get_container()->x);
}
这编译得非常好,编译器显然很乐意转换,但在容器按值返回的情况下则不然。get_container()->x
get_container().x
为什么会这样?如何让编译器在第一个示例中进行转换,而不显式保存返回值到局部变量?get_container()
答: 暂无答案
评论
_Atomic opaque x
mov rdi, rax
_Atomic
volatile
_Atomic
std::atomic
struct _opaque