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

C99如何在没有_generic(C11)的情况下键入泛型宏?,c,generics,types,macros,c-preprocessor,C,Generics,Types,Macros,C Preprocessor,查看tgmath.h的函数时, 我看到C99有一个类型泛型宏 我知道如何使用, 但是,直到C11,通用的才存在 我们在C89和C99中有遗留项目。 如果可能的话,我想以类似的方式实现类型泛型功能 在没有泛型选择的情况下,如何在C中编写类型泛型宏? C99如何在没有_generic(C11)的情况下键入泛型宏 不可携带 在C11之前的C中,没有编写类型泛型宏的通用方法 例如,如果查看作为glibc一部分提供的tgmath.h头,它不使用\u Generic(因为它需要与不支持\u Generic的

查看
tgmath.h
的函数时,
我看到C99有一个类型泛型宏

我知道如何使用,
但是,直到C11,通用的才存在

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

在没有泛型选择的情况下,如何在C中编写类型泛型宏?

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

不可携带

在C11之前的C中,没有编写类型泛型宏的通用方法

例如,如果查看作为glibc一部分提供的
tgmath.h
头,它不使用
\u Generic
(因为它需要与不支持
\u Generic
的编译器一起工作)。相反,它使用了一些特定于gcc的特性,如
\uu内置\uu分类\uu类型
,包装在一些显著的宏中。文件顶部附近有一条评论说:

/* 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
#如果(2,7)
/*很多丑陋的宏定义*/
#否则
#错误“不支持的编译器;您不能使用”
#恩迪夫
您可能可以使用
sizeof
将一些东西组合在一起,但这会很难看


您是否有可能使用支持C11或至少支持
\u Generic
功能的编译器编译遗留代码?

编译器及其.h文件可能会使用C规范中不可用的选项。IOWs,它不必按规则运行,我们会这样做。