我使用宏通用选择来"重载"我的自定义库中的一些函数,我想让它尽可能便携,所以我试图检查是否存在泛型选择支持
#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)
答案 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");