在查看用于平方吨的tgmath.h函数时,
我看到C99有一个类型-泛型宏。
我知道如何用泛型选择实现它,
但_Generic直到C11才存在。
我们在C89和C99中有遗留项目。
如果可能的话,我想以类似的方式实现类型通用功能。
如何在没有泛型选择的情况下用C编写类型的泛型宏?
发布于 2016-04-30 01:41:53
C99如何在没有_Generic (C11)的情况下键入泛型宏?
不可移植的。
在前C11 C中没有编写类型-泛型宏的通用方法。
例如,如果您查看作为glibc的一部分提供的tgmath.h头,它不使用_Generic (因为它需要与不支持_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特性编译遗留代码?
https://stackoverflow.com/questions/36949749
复制相似问题