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

问题描述 投票:0回答:2

我使用宏泛型选择来“重载”自定义库中的某些函数,并且我希望使其尽可能可移植,因此我尝试通过执行以下操作来检查是否存在泛型选择支持

#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)
c generics gcc clang c11
2个回答
7
投票

检查这一点的严格方法是

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

如果是一致的实现,编译器只能将

__STDC__
定义为值 1(参考:C11 6.10.8.1)。任何符合
__STDC_VERSION__ >= 201112L
的实现都必须实现
_Generic

但是,在完全支持 C11 之前,可能存在支持

_Generic
的编译器版本 - 您必须以某种特定于编译器的方式找到这些版本。


0
投票

从你的问题来看,你是否真的有

#else
部分并不明显,如果没有
_Generic
,这是一种替代策略。如果没有的话,整个“测试”就毫无意义。在文件开头定义良好的 use
_Generic
将有助于编译失败并显示错误消息:

_Static_assert(_Generic(0, default: 1), "we need _Generic");
© www.soinside.com 2019 - 2024. All rights reserved.