C99如何在没有_Generic(C11)的情况下键入泛型宏?

问题描述:

虽然看着sqrt功能tgmath.h,
我看到有一个C99的类型通用宏。C99如何在没有_Generic(C11)的情况下键入泛型宏?

我知道我将如何与Generic selection实现它,
_Generic并不存在,直到C11。

我们在C89和C99中有遗留项目。
如果可能,我想以类似的方式实现类型泛型功能。

如何在没有通用选择的情况下在C中写入类型泛型宏?

+0

编译器及其.h文件可能使用C规范中不可用的选项。 IOWs,它不需要遵守规则,我们可以。 – chux

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,doublelong 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功能的编译器编译遗留代码?