写在前面:此文将摘录C语言中容易被忽视的一些知识,并且加以思考为什么要那么做。
它可以存在的道理是:所有语言或多或少都有共同点,举一反三或许可以得到的更多。
我将以tip 1,2,3 当做标识持续更新下去,感兴趣的可以关注+收藏,谢谢。
PS: 双击屏幕可以使自己更专心哦,下面开始咯。
公众号: 黄桃罐头与蜘蛛 写一写可爱的事物。为什么是黄桃罐头与蜘蛛?mp.weixin.qq.com
Tip2: typedef 的妙用
最早发现typedef的好处是在刚接触函数指针的时候。
代码大概是这样:
这大概是typedef定义中最难理解的样子了。
比如:typedef关键字的定义是:
牛刀小试的时候,我们一般会把它当做#define的替代品:
这就非常容易理解,typedef用后面的标记代表了前面声明的类型。
它与#define的声明各有所长,且放后话。
回到上面的例子,
这里的typedef应该这么理解:
在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。
所以可以看出来spec_show_func 是那个变量名
顺理成章我们就可以用它来声明一种类型。
比如 : spec_show_func[10] , 数组中每一种都是函数指针,对应的参数,和返回值类型都一致。
为什么要这么写呢?正常的写法又是什么样子?
这里的含义是:
声明并定义一个含有10个元素的数组,数组中是如此类型的函数指针。
下面是对这个数组的赋值。
看起来还行?
那么如果我们需要两个数组呢?
对,复制粘贴就可以。看起来也不是很难。
那么来看一下用typedef的代码吧:
高下立判。
下面我总结了一些关于typedef的使用技巧和使用时机。
当然,还会有一些阻挠你的陷阱。
- 用typedef来定义与平台无关的类型。
如上文所述:
在更多的情况下,它可以声明一些类型可以起到隐藏信息的目的。
陷阱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关键字,因为当你声明的结构体中含有你自身结构体的指针时,会编译不通过。黄桃咬住葡萄出逃:malloc函数——一个低调的C语言学习者宝藏zhuanlan.zhihu.com
typedef struct {
xxx ;
node t * p_node;
} node_t ;
这样是错误的,请你老老实实使用stuct node{}; 的方式去定义。至于为什么,可以参考这篇文章中chapter 4.
思考:
其实typedef 这个关键字起的很妙: type define。 基本就很直白的告诉了我们它可以为我们做到什么。
我在学习python的时候,python号称万物皆对象,而class其实又何尝不是type define,只不过它在实现类型的声明之外,还可以对它的操作加入了方法,方法+变量已经形成了一种定式。
C语言是非常底层的语言,可是它随着标准的革新,也一步步得被赋予了新的使命,其实就我个人的理解,这都是程序员们想要“偷懒”的结果。 正是是因为想要偷懒,所以才抛弃那些繁复的重叠,一步步进步了起来。 而我也是为了偷懒,才学习python用来写一些自动化的脚本。
可能正是人类的这些想要偷懒的思想,才让这个社会慢慢步入现代自动化吧。