上篇 :Unix C语言值得注意的地方
看到新公司的烂代码,简直没法看,又不好给别人直接提出来,显得很狂妄。
写点心得,同大家讨论,大家一点点的补充!
在写代码的过程中,要一点点的把公共的东西都剥离开来,尽管开始的时候不是很明显,
没关系,发现可以复用的东西后,哪怕能节省10行程序,也要这么做,因为你
很快就会发现,不单单是10行的问题,而是调用次数×10,并且你还会发现在你以后对
功能的扩展和修改会起到很大的帮助。
例子:
当发现你要写的函数在其它函数的已经实现了部分功能的时候,千万不要把它抄过来,
而是把那个已经存在的函数分开。
MultiUse(int arg1, int arg2)
{
int a;
int b;
int c;
.....
a = b = c = 10;
}
改成:
MultiUse(int arg1, int arg2)
{
int a;
int b;
int c;
.....
__MultiUse(&a, &b, &c);
}
尽量不要使用全局变量,如果使用全局变量,也不要把全局变量定义在头文件中并且应使用static 全局变量,
其它文件中的函数如果要对其访问,那么提供一组extern函数。
例子:
static unsigned int WindowType;
unsigned int GetWindowType()
{
return WindowType;
}
void SetWindowType(unsigned int type)
{
WindowType = type;
}
原则上讲,有返回值的函数一定要进行错误处理,尽量不要利用函数的返回值作为下一步的选择条件,
除非函数不需要进行错误判断并且函数的工作就是返回一系列的类型
switch(GetType())
{
case 'A':
case 'B':
}
对于有返回值的函数在出错后 要return -1等小于零的值,成功return 0;
对于一个指针类型的话是NULL和非NULL,这是一个不成文的规定。
对于函数错误的处理尽量在选择结构的第一个分支中,否则在海量的代码中会让人莫名其妙。
if (BeginTrancation() < 0) {
/* 错误处理 */
abort();
return -1;
}
不要小看strcpy,strcmp和strlen、memcpy此类函数的效率,运行1000000次你看看多长时间,
在对效率要求较高的情况下应尽量减少此类操作而更应用指针来进行。
大的程序中不要使用fopen类的函数,尤其是在程序需要打开大量的文件的时候,因为fopen类的函数
在内核中是同256以下的文件描述字关联的,一旦打开很多文件后,256以下没有可用的文件描述
字后,fopen就会失败。
下篇 :写给C语言初学者的话
前些天我写了一篇“Unix C语言值得注意的地方”一贴,回贴中谈到学习国外的开源软件中的高质量代码的问题,但是有朋友跟我说,在看代码的过程中感觉
难度很大,想想也是如此,动辄十几万行的程序如果没有人指点的话是很难找到切入点的,所以我撰写了此文希望能对广大C语言爱好者有所帮助,在文章中有很多
煽情的地方还请大家原谅,因为这篇文章使我想到了刚刚毕业的时候,所以有点感慨。同时文章中还有一些个人偏见存在,希望持反方向意见的人多多包涵,既然是
偏见,那它只是偏见。
学习C语言不要心急,要循序渐进,须知欲速则不达的道理。千万不要盲目的写大量的代码,这样做只会堆出
大量的低档次代码,同时使你形成不好的代码习惯。先买本基础的教材来看看,使得对C语言有个初步的认识,其实我现在手头上还放着
《The C Programming Language》和《C程序设计(第二版)》(大学教材)呢,有些时候我还会为了一些基本性的概念来翻翻看呢。
如果你的身边有高水平的开发人员,那么再好不过了,多多向别人请教。但是就我了解的情况来看,大部分的初学者并没有在进入IT行
业后得到一个资深的软件工程师的指导,而恰恰是在入司后就被推向前线,替老板们骗取客户口袋里的钱,在这个过程中很多人都是在苦苦的堆代码,赚着可怜的薪
资。尽管我也是在拿着可怜的钱,但是有一点我是幸运的,因为我在我的第一家公司里遇到了带领我走向Unix和C语言领域的导师,正是他的一句“Unix和
C语言是你一生都要去学习的技术”让我狂热的爱上了它们,正是他的一句“你有root口令,并不是你有root口令这么简单,更多的是一种责任”(说这句
话的前提是我用root口令进入SUN服务器后删除了别人的东西,因为我认为这些是无用的东西)使我对责任这两个字有一个非常具体的认识。所以在这里请广
大读者允许我用一些篇幅来对我neusoft的导师yuhj表示深深的感谢。同时也对CU的朋友们表示深深的感谢,可以说,你们是我的第二导师,我已经离
不开你们了。
希望大家都比我幸运,没有得到幸运之神垂青的朋友们也不要灰心,多上CU上来和大家交流交流,讨论讨论吧,但是
注意在论坛上讨论的时候不要刨根问底,很多事情不是一句话就说的清楚的,别人只能给你一个指引,再具体的只有靠自己多研究研究、琢磨琢磨。闲暇的时候去精
华区看看,你会有意外的收获的。
千万不要一看到英文就头大,尽管我也是这样,并不是看不懂(毕竟也接受过CET4、6级哑巴
英语的教育,还是能看懂的)。man的帮助是最好的教材并且很多国外的论坛对技术的描述是很清楚的,也是很简单的,更重要的是,你会在上面看到些在国内论
坛上看不到的东西(计算机的技术一直都是由西方向东方传递,希望有朝一日老外都到我们中国的论坛上来寻找技术资料)。
学习C
语言有一件事情也是必须要学的,而且最好是同时学,有的朋友可能已经猜出来了,没错,是Unix。Unix和C语言可以说大家提的很多了,有Unix的地
方就有C语言,同时也正是有了C语言,才有了Unix(我们还是先讨论讨论鸡生蛋还是蛋生鸡的哲学问题吧,谁拿西红柿打我),甚至有人说C语言就是为了
Unix而设计的,可见Unix和C语言之间的非同寻常的关系。学习Unix现在容易多了,以前Unix都是运行在大型的服务器上的,可是现在有了
Linux(按照GNU的意思,Linux就是Linux还不能叫Unix),大家可以在自己的PC上装一套Linux来学习,注意学习Linux不要拿
Linux和Windows来比较,它们不可同日而语。Linux会让你知道什么是经典,永远让你在一个方向上大展宏图,Windows只会让你在别人的
套子里耍上大刀,不时的还要换一个套子耍耍。下面罗列了一些我在学习Unix的一些经验:
1、学习Unix和C语言,先向大
家推荐一本书《Unix高级环境编程》,这本书是学习Unix和C的经典之作,尽量把书中提到的系统调用都写个练习程序,先感性的认识一下Linux系统
提供给用户的系统调用都是干什么的,怎么用。系统调用是内核提供给用户的功能用以申请内核服务,对于Linux内核的学习,从系统调用入手是个不错的办
法。学习过程可以参看Linux的联机帮助,和网络上的资料。当你觉得差不多了的时候,那我给大家出一道联系题目吧:实现一个ftp服务器和客户端的功
能,完全可以自己定义一些应用层的协议,只要能实现用简单的命令传输文件就可以了。
这个题目可以使你练习到TCP/IP的基本编程方法和文件操作的基本方法对于后面学习内核的文件系统会有帮助的。
2、
当你对Unix系统有了些了解后,同时对于大部分的系统调用(关键是关于文件的系统调用,对于Linux系统的内核来说从文件系统入手相对容易一些)也有
了清楚的认识后,再推荐你一本书《Linux内核情景分析》,该书是关于Linux内核的经典之作唯一美中不足的是没有关于网络子系统的详细介绍。你可以
从文件系统的系统调用入手,慢慢的你就会对Linux有了一个更深入的认识。同时注意很多经典的方法和思想在Linux中的运用。你会认识到为什么
Unix把所有的东西都看成文件,对什么东西操作都是对文件操作,你会慢慢体会到Unix的经典之处了。
3、当你对
Linux内核有了些了解后,你就可以找个方向来专门发展了,如果你想对眼下流行的网络编程感兴趣,那么再推荐你一本书《TCP/IP详细解释》,这本书
是关于TCP/IP协议的经典之作。你会学习到TCP/IP协议栈是如果实现的,为什么,各层协议之间是如何工作的。你看完了这本书后,你就可以自己写一
个dos攻击程序和sniffer了。
我说的简单,其实我提到的每本书至少都够你研究很长时间的,所以希望初学者别着急不骄不躁,相信只要努力过,一定会成为高手的。
在写代码的时候大家要注意养成好的代码习惯和风格还有抽象能力。
下面给出大家在写代码的时候的20字方针:
函数要小 尽量的把函数弄的通用点,代码行少点,一个函数只完成一个简单的功能,一眼就能看出来此函数有没有代码错误,每个函数都是健壮的,那么你的程序就是健壮的。
代码要少 完成一个功能的时候在逻辑清楚的情况下代码越少越好,千万不要比代码谁写的多啊。
算法要好 在完成一个功能的时候要考虑效率,目前计算机的内存很大,所以内存已经不是首要考虑的因素了,但是在某些特殊的地方效率
还是很重要的。有效率高的算法,就不用效率低的算法,看看本版有一篇精华贴子是关于把一个字符窜两边的空格去掉的帖子(trim),很多人都提出了算法,
但是有一个算法是最好的,效率最高,代码最少,是算法要好的最好体现
命名要清 命名要清楚,最要用汉语中的谓宾结构如set_buffsize()
文件要多 尽量把一个大的程序安功能分成多个文件,一个文件尽量不要超作1000行,这样就很清楚的知道那个文件代码是健壮的,那个文件有可能有隐患,在代码检查的时候可以有针对性的检查某几个文件
阅读(1008) | 评论(0) | 转发(0) |