前言
目前C语言被应用得最多的估计就是嵌入式了,在学校学习完C语言,考完等级考试之后,可能就会觉得自己的C语言掌握的还可以了。但这其实只能算入门,像结构体,指针等内容还有很多东西需要去深究,还有GNU的一些补充语法。接下来,我们来探讨一下如何提升!
打怪升级
1. C语言三剑客
C语言经典三剑客《C和指针》《C陷阱与缺陷》《C专家编程》,这三本书相信很多人都听过。对于想提升C编程能力,这三本是绝对要去阅读一下的。单纯阅读肯定很枯燥,所以阅读过程中还是要去动动手的。这三本书的章节其实也没什么必然的关联性,所以建议大家可以挑着看,最近想看研究一下指针,就看"指针"的章节, 想研究动态内存分配, 就看"动态内存分配"章节。毕竟这不是入门书籍。
2. GNU C语法
首先我们先来了解一些概念,ANSI C 、POSIX C、GNU C到底是啥?之间到底有啥关系?
ANSI C :由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI C 标准指定的所有的库函数,以及由POSIX或其他UNIX操作系统变种指定的附加特色,还包括有与GNU系统相关的扩展。
OK, 有了上面的概念之后。你可能会明白为什么有时候会看到一些奇怪的语法,然后去查课本又找不到。目前大学里的课本是按ANSI C来编写的,都是标准的C语言语法。所以也不用课本垃圾,语法编写不完整!
回到GNU C上面,GUN C提供了一些新的语法功能,对于做Linux开发的,肯定是必须要接触的。比如:GNU C支持零长度数组。
typedef struct test1{
int len;
char a[0]; // 零长度数组
}TEST1;
这个时候数组是不占用内存的,如果声明指针是会占用内存的。这玩意有什么作用呢?简单看一下下面的代码:
typedef struct test1{
int a;
char b[0]; //零长度数组
}TEST1;
int main()
{
char str[] = "helloworld";
//malloc分配空间
TEST1* test1 = (TEST1*)malloc(sizeof(TEST1) + 20);
printf("%p ", &(test1->a));
printf("%p ", (test1->b));
//字符串复制
memcpy(test1->b, str, sizeof(str));
printf("%s ", test1->b);
}
这个时候我们就可以通过结构体(TEST1)成员b去访问后面的地址了。它更多是被用在长度不确定的数据上。大家还可以去思考对比一下和指针的差异!
3. 阅读开源代码
个人认为,阅读一下好的开源代码或者原厂提供的一些SDK,对于个人编码能力会有很大提升。学习他们一些好的编码规范和整体架构设计理念,最最经典的当然就是Linux系统了。其实阅读源码并不一定要完全理解代码功能之类的 ,我们更多是去学习为什么这么写, 这么写用什么好处。当然了,也并不是所有都是好的,我们也是取其精华去其糟粕嘛!
来看个小例子:
#define MAX( a, b) ( (a) > (b)?(a) : (b) )
int max( int a, int b)
{
return ((a > b)? a : b);
}
上面是要对比两个数的大小,一个是用宏实现,一个使用函数实现。你觉得哪个比较好?
首先,宏会比较简洁;然后宏可以传递各种类型的参数,而函数只能传递int类型的;最后函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。
但是宏也有缺点,宏在预编译时会拷贝到所有调用的位置,这样就会使编译出来的文件变大。
所以这需要看实际情况来选择了,这个东西我也是在Linux源码上发现的,Linux最近更新的版本很经常将一些函数替换成宏的形式。所以多阅读,多思考,会提升很快的!
4. 多踩坑,多思考
这东西说起来很虚,实践出真知!只有在做项目的时候,你才会知道,原来某些东西组合起来一起用会有这么多坑。还有就是多思考,多总结,这绝对会事半功倍!不要觉得,反正是“面向浏览器编程”,记那么多干嘛。
全部0条评论
快来发表一下你的评论吧 !