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

时间:2017-03-09 14:49:58

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

2 个答案:

答案 0 :(得分:4)

检查这个的严格方法是

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

如果符合实现,编译器只能将__STDC__定义为值1(参考:C11 6.10.8.1)。使用__STDC_VERSION >= 201112L的任何符合要求的实施都必须实施_Generic

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

答案 1 :(得分:0)

从您的问题来看,如果您确实拥有#else部分并不明显,如果没有_Generic则这是另一种策略。如果你没有那个,整个“测试”有点毫无意义。在文件开头有一个明确定义的使用 _Generic将有助于编译失败并显示错误消息:

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