前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(4.11)C语言(继续死磕typeof)

(4.11)C语言(继续死磕typeof)

作者头像
用户2617681
发布2019-08-08 16:08:44
1.3K0
发布2019-08-08 16:08:44
举报
文章被收录于专栏:秘籍酷秘籍酷

拓展:

typeof通常被用在复杂宏的语句表达式中,下面的例子,用来说明如何使用typeof来获取宏参数的类型,并且安全地让宏参数只运行一遍:

使用带下划线的局部变量名字是为了避免跟本语句中所要替换的a和b冲突。

更多关于typeof的例子:

1,定义一个变量,类型跟x指向的数据相同

typeof (*x) y;

2,定义一个数组,元素的类型跟x指向的数据相同

typeof(*x) y[4];

3,定义一个数组,元素的类型是char *

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

使用typeof声明来写以下这两个宏:

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

现在可以这样定义变量:

array (pointer (char), 4) y;

y是一个包含4个指向char型数据的指针的数组。

温馨提示:以上技能基本没什么卵用。下面

最后,在gcc中你还可以使用 __auto_type 来取代 typeof,此外 __auto_type 声明语句只能声明一个变量,而且必须带初始化值,变量的类型取决于初始化的数据的类型,变量的作用域从初始化之后开始。使用 __aotu_type 的宏MAX()改写后是这样的:

#define MAX(a, b) \

({

__auto_type _a = (a); \

__auto_type _b = (b); \

_a > _b ? _a : _b; \

})

使用 __auto_type 的好处是:

  1. 所有宏参数都严格只出现一次,这就避免了使用包含该宏作为参数又嵌套传递给该宏时,所产生的参数的指数级增长。
  2. 如果宏参数包含变长数组(VLA)的话,使用 __auto_type 将只会解析一次,而使用 typeof 将会解析两次。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档