C99如何在没有_Generic(C11)的情况下键入泛型宏?
问题描述:
虽然看着sqrt功能tgmath.h
,
我看到有一个C99的类型通用宏。C99如何在没有_Generic(C11)的情况下键入泛型宏?
我知道我将如何与Generic selection实现它,
但_Generic
并不存在,直到C11。
我们在C89和C99中有遗留项目。
如果可能,我想以类似的方式实现类型泛型功能。
如何在没有通用选择的情况下在C中写入类型泛型宏?
答
C99如何在没有_Generic(C11)的情况下键入泛型宏?
非便携式。
还有如果你看一下作为glibc的一部分提供的tgmath.h
头,例如,它不使用_Generic
写一个类型的通用宏预C11 C.
(因为没有通用的方法它需要与不支持_Generic
的编译器一起工作)。相反,它使用了一些gcc特有的功能,如包含在一些非凡的宏中的__builtin_classify_type
。靠近文件顶部的评论说:
/* This is ugly but unless gcc gets appropriate builtins we have to do
something like this. Don't ask how it works. */
一些宏定义的比较sizeof (Val)
(其中Val
是宏参数)与sizeof (double)
。如果float
,double
和long double
并不都具有不同的大小,则可能会失败。
而且整个事情是包裹在:
#if __GNUC_PREREQ (2, 7)
/* a lot of ugly macro definitions */
#else
# error "Unsupported compiler; you cannot use <tgmath.h>"
#endif
你也许可以拼凑使用sizeof
的东西,但它是丑陋的。
有没有可能使用支持C11或至少_Generic
功能的编译器编译遗留代码?
编译器及其.h文件可能使用C规范中不可用的选项。 IOWs,它不需要遵守规则,我们可以。 – chux