不使用_Generic(C11),C99如何键入通用宏?
非便携式的。
没有通用的方法可以在C11 C之前的版本中编写类型通用宏。
例如,如果您查看tgmath.h
作为glibc一部分提供的标头,它就不会使用_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
功能的编译器来编译旧代码?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句