首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C99如何在没有_Generic (C11)的情况下键入泛型宏?

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

Stack Overflow用户
提问于 2016-04-30 01:32:27
回答 1查看 1.9K关注 0票数 2

在查看用于平方吨tgmath.h函数时,

我看到C99有一个类型-泛型宏。

我知道如何用泛型选择实现它,

_Generic直到C11才存在。

我们在C89和C99中有遗留项目。

如果可能的话,我想以类似的方式实现类型通用功能。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-30 01:41:53

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

不可移植的。

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

例如,如果您查看作为glibc的一部分提供的tgmath.h头,它不使用_Generic (因为它需要与不支持_Generic的编译器一起工作)。相反,它使用了一些特定于gcc的特性,比如封装在一些了不起的宏中的__builtin_classify_type。文件顶部的一条评论说:

代码语言:javascript
复制
/* 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)进行比较。如果floatdoublelong double并不都有不同的大小,这可能会失败。

整件事都被包裹在:

代码语言:javascript
复制
#if __GNUC_PREREQ (2, 7)
/* a lot of ugly macro definitions */
#else
# error "Unsupported compiler; you cannot use <tgmath.h>"
#endif

您可能可以使用sizeof将一些东西组合在一起,但这将是很难看的。

是否有可能使用支持C11的编译器或至少使用_Generic特性编译遗留代码?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36949749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档