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

标签 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))

(检查底部的编辑注释以查看准确的编译器版本)

因为这些编译器版本应该支持某些 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

编译器只能将 __STDC__ 定义为值 1,前提是它是符合标准的实现(引用:C11 6.10.8.1)。任何符合 __STDC_VERSION >= 201112L 的实现都必须实现 _Generic

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

关于在 C 中检查对 _Generic() 选择的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698382/

相关文章:

c - UAEexpert 找不到 OPC UA 服务器证书

c - 使用指向字符串的指针数组将字符串中的子字符串替换为c中的另一个子字符串

java - 为什么调用具有不同类型的泛型方法会出现编译错误?

c++ - 嵌套类奇怪函数查找: surrounding class functions hide global functions

c - linux kernel "listen"如何到C库?

c - 有没有办法打破 C 中的上级循环?

c# - 编译器无法从包装的通用 IEnumerable 推断类型

java - 比较通用列表中的元素

visual-c++ - GCC 和 MSVC 中是否存在 "simd reduction(:)"?

在 C 中不使用 main() 编译和运行程序