在 C 中检查对 _Generic() 选择的支持

Checking support for _Generic() selection in C

我使用宏泛型选择来 "overload" 我的自定义库中的一些函数,我想让它尽可能可移植,所以我试图检查是否存在泛型选择支持

#if ((__STDC_VERSION__>=201112L) || ((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40600) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30100) || (__xlC__>=0x1201))

(查看底部的编辑说明以查看准确的编译器版本)

因为这些编译器版本应该支持某些 c11 特性,但我不确定这些版本是否真的支持泛型选择; 谁能证实?或者还有其他方法吗?

.

.

编辑: 支持 _Generic 关键字的编译器版本实际上是:

((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40900) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30000) || (__xlC__>=0x1201)

检查这个的严格方法是

#if __STDC__==1 && __STDC_VERSION >= 201112L

如果编译器是符合标准的实现(参考:C11 6.10.8.1),则编译器只能将 __STDC__ 定义为值 1。任何符合 __STDC_VERSION >= 201112L 的实现都必须实现 _Generic.

然而,在获得完整的 C11 支持之前,可能存在支持 _Generic 的编译器版本 - 您必须以某种特定于编译器的方式找到它们。

从你的问题来看,你是否真的有一个 #else 部分并不明显,如果没有 _Generic,那是一个替代策略。如果你没有那个,整个 "testing" 就有点毫无意义了。在文件开头定义明确的 use of _Generic 将有助于编译失败并显示错误消息:

_Static_assert(_Generic(0, default: 1), "we need _Generic");