1835_GCC中C语言typeof的使用
  tSnhejlQLwoc 2023年12月22日 32 0


Grey

全部学习内容汇总:GitHub - GreyZhang/c_basic: little bits of c.

1835_GCC中C语言typeof的使用

typeof是C语言中对数据类型的一种引用方法,目前看到的信息来看,并不是标准C中提供或者要求的内容。这个功能,其实是编译器提供的一种便捷的操作模式。而我看的资料中,这个功能在gcc中是有提供的。至于其他的编译器,是否也提供了类似的功能,这个还真不好讲。因此,利用这个功能相关的一些设计,我也暂时不会纳入到我自己的C语言工具箱中。

从哪里看到的这样的用法

最近从国科础石开放的开源项目中看到了一个RTOS,我获取了他仓库的代码。简单浏览看到了一个list.h,查看后是一个以内敛方式提供的一个链表操作。看到这样的设计的时候,我觉得很吸精,其实这种设计看上去有很好的通用性。而且,从注释看,其实这个设计也是来自于linux内核的。

1835_GCC中C语言typeof的使用_开发语言

上面是文件开头的部分,不仅看到了我说的拷贝的说明,而且也看到了我今天探索的这个功能。

资料整理过程说明

在此之前的确是没有用过 typeof ,先去看了一下这个文档。找到了如下链接:

Typeof (Using the GNU Compiler Collection (GCC))

这本身也是 gcc 的文档,查看上层的文档结构如下:

1835_GCC中C语言typeof的使用_mfc_02

从这里可以看出来,这个是gcc对于C语言的扩展。从描述看,其实C99中是已经支持了这样的功能的,但是C99并不是标准C的来源,因此标准C来源的C90其实是不支持的。

要点细节分析

typeof (x[0](1))

x是一个函数指针数组,上面的功能实现的是获取对应函数返回值的类型。

typeof (int *)

一个指向整形的指针类型。

上面是文档中的两个例子,其实从这两个例子可以看得出来,这个typeof其实是可以快速构建出来一个新的隐藏式的数据类型的。这个构建的速度或者说便捷性是比typedef要快很多的。

更多探索以及效果分析

#define max(a,b) \
  ({ typeof (a) _a = (a); \
      typeof (b) _b = (b); \
    _a > _b ? _a : _b; })

这是另一个使用的示范,实现的是最大值求值的宏。这个设计相比不使用typeof实现的功能有点在于数据类型可以根据输入的信息进行动态的调整,达到“自适应”的效果,可以避免溢出等一系列的问题。

typeof (*x) y;

结合前面的分析,这一段代码快速定义了一个变量y,y是一个指向x类型的指针所指向的内容。也就是说,x本身是一个指针,而y相当于对这个指针类型的引用类型。

typeof (*x) y[4];

这个例子与上面功能类似,只是此时y是一个4个元素的数组。

typeof (typeof (char *)[4]) y;

这是一个双重的引用,首先里面的typeof实现了对于一个字符串指针的引用,接下来扩展为4元素数组。而这样的语义,进一步由外面的typeof来继承。最终,构建出来了y,表征一个四元素指针数组。

#define pointer(T)  typeof(T *)
#define array(T, N) typeof(T [N])

array (pointer (char), 4) y;

这样的一个语言元素的组合抽象,让整个数据对象的构建理解变得更加人性化。很容易理解最后行代码其实是定义了一个y,而y是一个4个char指针元素的数组。

小结

从上面的处理看,我觉得typeof的功能不仅仅是紧急应用,可以在typeof没有构建的情况下迅速组合出来新的数据类型引用方式,而且让语言的设计具备了更好的伸缩度。这不仅是typeof的一个变种或者替代品,有着更加灵活的方式。但是,这也不是在任何场景下都是最优秀的设计方案。如下的例子就是一个说明:

#define max(a,b) \
  ({ __auto_type _a = (a); \
      __auto_type _b = (b); \
    _a > _b ? _a : _b; })

这里有了一个新的max的实现方式,依然具有前面实现方式的优点。但是,这种使用方式会让max的组合调用有更好的处理方式。不会像typeof一样,多重组合调用会有指数型增长的调用展开消耗。什么是这种组合调用呢?大概的形式应该如下:

x = max(max(a, b), max(max(c, d), e));

这是很好的语言特性,这样的语言特性一定催进了很多信息化的发展。不过,在控制类的嵌入式领域之中,或许这种能力的展示显得过于滞后。至少目前为止,我还没有在项目应用中看到过这样的设计应用。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
  TKwJ4YzyA8uz   5天前   14   0   0 C语言
  fHBiUfJyY67V   26天前   17   0   0 C语言
  V88gxnVgnp1F   14天前   69   0   0 C语言
  o1ZcTI9mJsxK   14天前   83   0   0 C语言
tSnhejlQLwoc