我使用宏泛型选择来“重载”我的自定义库中的一些函数,我想让它尽可能地可移植,所以我试图通过执行以下操作来检查是否存在泛型选择支持
#if ((__STDC_VERSION__>=201112L) || ((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40600) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30100) || (__xlC__>=0x1201))
Run Code Online (Sandbox Code Playgroud)
(检查底部的编辑说明以查看准确的编译器版本)
由于这些编译器版本应该支持一些 c11 特性,但我实际上不确定这些版本是否真的支持泛型选择;有人可以确认吗?或者有另一种方法吗?
.
.
编辑:支持 _Generic 关键字的编译器版本实际上是:
((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40900) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30000) || (__xlC__>=0x1201)
Run Code Online (Sandbox Code Playgroud) 整个方法调用是原子的还是只是 BiFunction 执行是原子的?是阻止所有键还是仅阻止同一键上的调用?
我在 cppreference 上找到了
_Atomic ( type-name ) (自 C11 起)
用作类型说明符;这指定了一个新的原子类型
_Atomic type-name (2)(自 C11 起)
用作类型限定符;这指定类型名称的原子版本。在此角色中,它可以与 const、volatility 和 limit 混合使用),尽管与其他限定符不同,类型名称的原子版本可能具有不同的大小、对齐方式和对象表示形式。
那么使用_Atomic(int)而不是_Atomic int
保证它的大小相同int或不同吗?
在 Ex 中使用限定符_Atomic
:
_Atomic(volatile int)
Run Code Online (Sandbox Code Playgroud)
抛出错误,但像这样使用它:
_Atomic(volatile _Atomic(int)*)
Run Code Online (Sandbox Code Playgroud)
才不是; 这是标准行为吗?
我注意到原子函数(例如:atomic_store、atomic_load、atomic_compare_exchange_weak)可以在传递的类型不为_Atomic类型的情况下工作,并且我仍然可以毫无问题地管理竞争条件。这是标准行为吗?它有缺点或导致任何错误吗?