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

Ale*_*Sim 5 c generics gcc clang c11

我使用宏泛型选择来“重载”我的自定义库中的一些函数,我想让它尽可能地可移植,所以我试图通过执行以下操作来检查是否存在泛型选择支持

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

Lun*_*din 5

检查这一点的严格方法是

#if __STDC__==1 && __STDC_VERSION >= 201112L
Run Code Online (Sandbox Code Playgroud)

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

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