c语言show函数_C语言“隐秘的角落”——typedef的妙用

写在前面:此文将摘录C语言中容易被忽视的一些知识,并且加以思考为什么要那么做。

它可以存在的道理是:所有语言或多或少都有共同点,举一反三或许可以得到的更多。

我将以tip 1,2,3 当做标识持续更新下去,感兴趣的可以关注+收藏,谢谢。

PS: 双击屏幕可以使自己更专心哦,下面开始咯。

公众号: 黄桃罐头与蜘蛛 写一写可爱的事物。
为什么是黄桃罐头与蜘蛛?​mp.weixin.qq.com

f8e5fbf96b6fab4a8fe313d88ed8137e.png

Tip2: typedef 的妙用

最早发现typedef的好处是在刚接触函数指针的时候。

代码大概是这样:

4b39625de8c5fdd7fc28ea1e31a21103.png

53bb5749945599b67d9085c727a11c25.png

这大概是typedef定义中最难理解的样子了。


比如:typedef关键字的定义是:

639aa397e4c7be2d1e2dedfbc23ce391.png

牛刀小试的时候,我们一般会把它当做#define的替代品:

969d783ae4490c693c0f19f1e8ce6bf8.png

这就非常容易理解,typedef用后面的标记代表了前面声明的类型。

它与#define的声明各有所长,且放后话。

回到上面的例子,

这里的typedef应该这么理解:

在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。

所以可以看出来spec_show_func 是那个变量名

4b39625de8c5fdd7fc28ea1e31a21103.png

顺理成章我们就可以用它来声明一种类型。

比如 : spec_show_func[10] , 数组中每一种都是函数指针,对应的参数,和返回值类型都一致。

为什么要这么写呢?正常的写法又是什么样子?

aa6fa54fce83e95a432732e91b7b468e.png

这里的含义是:

声明并定义一个含有10个元素的数组,数组中是如此类型的函数指针。

下面是对这个数组的赋值。

看起来还行?

那么如果我们需要两个数组呢?

41acc1019a72fd22c2d4707966e99e0d.png

对,复制粘贴就可以。看起来也不是很难。

那么来看一下用typedef的代码吧:

5913ec5a4e4190a28cfb656719848476.png

高下立判。

下面我总结了一些关于typedef的使用技巧和使用时机。

当然,还会有一些阻挠你的陷阱。

  • 用typedef来定义与平台无关的类型。

如上文所述:

969d783ae4490c693c0f19f1e8ce6bf8.png

在更多的情况下,它可以声明一些类型可以起到隐藏信息的目的。

陷阱1:由于typedef本身就是关键字,它不能够与其他如static , const一起使用。 陷阱2: 请注意它与#define的区别,并且选择适当的情况下使用。举一个例子, typedef char * p_char , 在函数中 void func ( const p_char p) 传参const p_char 是一个指针常量,翻译过来是char* const p, 并不是const char* p;
  • 用来优化代码结构,使代码避免臃肿,增加复用性。

总的来说,就是归类。

C语言并不是OOP语言,它一半是火焰,一半是海水。它非常的细腻,将所有的类型恨不得都给你分的很细,同时它也变得非常的严格,它会对你的代码要求很高。

我们会有很多场景下有一些相同的参数要求,可是我们不需要每次都去声明定义它们,就像上述的函数指针一样。

那么使用typedef 来统一归类是一个非常不错的选择。

它还会让你的代码看起来更有层次。

  • 在你想要声明函数指针的时候,请想到它。

我非常建议你在使用函数指针的时候使用它,除非你只想在一个函数中使用。

同时:

我也希望你在声明struct 和 union的时候使用它。

无脑使用它。

除了一种情况:

陷阱:当你使用链表的时候,请不要使用typedef关键字,因为当你声明的结构体中含有你自身结构体的指针时,会编译不通过。
typedef struct {
xxx ;
node t * p_node;
} node_t ;
这样是错误的,请你老老实实使用stuct node{}; 的方式去定义。至于为什么,可以参考这篇文章中chapter 4.
黄桃咬住葡萄出逃:malloc函数——一个低调的C语言学习者宝藏​zhuanlan.zhihu.com
2d3d879285b9b36c7ab70c5c2a817879.png
思考:
其实typedef 这个关键字起的很妙: type define。 基本就很直白的告诉了我们它可以为我们做到什么。
我在学习python的时候,python号称万物皆对象,而class其实又何尝不是type define,只不过它在实现类型的声明之外,还可以对它的操作加入了方法,方法+变量已经形成了一种定式。
C语言是非常底层的语言,可是它随着标准的革新,也一步步得被赋予了新的使命,其实就我个人的理解,这都是程序员们想要“偷懒”的结果。 正是是因为想要偷懒,所以才抛弃那些繁复的重叠,一步步进步了起来。 而我也是为了偷懒,才学习python用来写一些自动化的脚本。
可能正是人类的这些想要偷懒的思想,才让这个社会慢慢步入现代自动化吧。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值