马上要找工作了,话说找工作的三大法宝:程序设计、算法、操作系统。这玩意短时间不能提高太多了,先从自我修养谈起吧。修养应该是在日常生活中积累的,但是先记住法则吧。
1.版权和版本 函数注释
学生时代写程序,谁会傻呵呵地写个版权啊。写个注释,你有病啊。话说高水平的linux程序员连文档都不写。我说我不功利,还是算了吧,孩子。进入社会,要成熟些的.
文件描述:
文件名 文件描述 版权 版本号 日期 修改记录
函数描述:
函数名 函数描述 参数 返回值 作者 日期
2.缩进、空格、换行、空行、对齐
所有说的这些,应该只有一个目的,让你的程序的外表清爽,整洁。
3.程序注释
这个应该不需多说,老师不厌其烦地说,但我们就是懒呀。以后可能就是专业运动员了,好好遵守规则。
加注释的地方:文件注释、函数注释、变量注释、算法注释、功能块程序注释。
4.函数的[in][out]参数
这个是说要对函数传来的参数进行合法性检查,对函数传出去的参数也要检查。
5.对系统调用的返回进行判断
对于一些系统调用,比如打开文件,应判断下是否为空。对空文件操作,你有病啊。
6.if 语句对出错的处理
if 正条件 正常处理 else 出错处理----->if 错条件 出错处理;正常处理
这种改变能够先判断出错条件,不至于使得正常处理代码过多将出错条件淹没在茫茫代码中。
7.头文件中的#ifndef
这种方式在c语言中常见吧,主要是防止两个c文件的头文件重复编译,造成声明冲突。
#ifndef 标识 #define 标识 #include
8.在堆上分配内存
简单来说,堆上malloc分配内存,记得一定到free掉,以防内存未释放,造成内存泄露。
C++中是new 和delete成对出现,尽量在一个函数中,记得malloc的要初始化下。
java中?谁管这破事啊!gc垃圾回收,你懂得,但好像也不是万能的。
9.变量初始化
malloc堆上分配的使用使用memset初始化(清零),栈上分配的struct和数组也尽量初始化。
对于全局变量和静态变量一定要在使用前初始化。
10.h文件和c文件
就是说h文件和c文件的分工问题呗,即声明和实现分离,H文件中一般是变量、宏定义、枚举、结构和函数接口的声明,就像一个接口说明文件一样。而C文件则是实现细节。
带有初始化信息的全局变量不要放在头文件中。正确写法:在c文件中定义,其他引用这个变量的c文件加上extern关键字。
11.出错信息管理
这种感觉不是错误即打即用的那种,而是要把这些错误信息统一地管理起来,即经常听老师讲过的定义错误码。
12.常用函数和循环语句的计算量
就是说,一个函数在循环体内多次执行,但是这个函数结果是不变的。这样的话,肯定会浪费执行时间。这时,把这个函数移到函数体外,只使用函数结果。
对于一个经常调用的函数体内的变量,声明成static变量会省去分配内存开销,执行效率会得到提升。
13.函数名和变量名的命名
这个c语言老师就不停地嘱咐过吧,感觉主要就是望文知义。
避免全局函数和变量名字冲突,加上前缀,同学一般没有编写过大型程序,体会不是很深。我们一个老师曾说过,他们在做工程时曾遇到过非常莫名的问题,后来就是变量命名问题,以后他们选择将自己的名字作为函数的前缀防止冲突。
14.值传递和指针传递
函数参数中传入非const的指针时,就表示要修改这个指针指向内存中的数据。
但是,传值,在函数体内部不会对传入的这个值变量进行任何修改,相当于内存拷贝。
15.修改别人的代码
修改别人程序时不要直接删除别人的程序,应该先把别人的程序注释掉,然后添加自己的程序。相比一般的菜鸟选手也不会直接删除人家的程序,起码可以留下来做个参考嘛。
16.把相同或近乎相同的代码形成函数和宏
把相似的代码抽取出来,捣鼓成一个函数,在使用的地方直接调用这个函数就可以了。
例如,程序中可能会有多处连接数据库的地方,这时就可以抽取出来,做个函数,甚至说类。
这样也方便程序的修改,这个用宏定义个常量,容易理解吧
如定义网络编程中的端口号,程序中10次用到这个端口号,定义为宏,只需要修改一次,然而,前者需要寻找到这十个地方,然后逐个修改。
17.表达式中的括号
这个不必多说吧,不要为了显示出自个牛X,故意把括号去掉,到头来可能把自己也坑了。
18.函数参数中的const
在c++中,要多多使用const,const成员,const函数,这可以使得程序更加完整和理解。
19.函数参数不要过多,多了就使用结构体
在阅读一些linux下的程序时,经常可以看到使用结构体,作为参数。这能够方便数据的封装,维护程序的简洁性。
20.函数返回类型,不要省
主要是为了代码的可读性,对于void函数,也要加上return;为啥?不知道。
21.不要使用goto
说是不利于代码维护。据说一般逻辑流程都可以使用顺序、循环、判断这三种基本类型代码。
22.谨慎使用宏
不知道宏展开到底是个什么样子,如果使用,参数要加上括号。
虽然宏速度很快,但是展开会使得源代码扩张,目标文件增大。是不是说,java中都看不到宏的存在了。
23.static的使用
static可以修饰变量和函数。
static 变量:具有作用域的全局变量,应是比较常见的用法。12条也说过,对于经常调用的变量,应声明为static。
对于函数来讲,static的作用仅限于隐藏。即static的最大的作用在于控制访问。如果在一个c文件中,一个函数或是一个全局变量被声明为static,那么,这个函数和这个全局变量,将只能在这个C文件中被访问,如果在别的C文件中调用这个C文件中的函数,或是使用全局变量(用extern关键字),将会发生链接时错误。这个特性可以用于数据和程序保密。
另外,static还能将数组默认为0.
24.函数代码尺寸
一个函数的代码不要过大,也尽量不要在一个函数内做多个事情。
一个函数的功能要单一,便于为其他程序提供服务,可读性。有的面向对象中设计思想了。
25.typedef的使用
typedef是一个给类型A起别名的关键字B, typedef A B。代码中使用的是B,但代表A的意思。
不同的平台下可能具有不同的字长,在跨平台的工作时,16位机上使用typedef int16 INT,32位机上 type int32 INT。但INT是统一类型名字,在代码中出现,修改时只需更改typedef定义即可,便于维护。
不同的程序员可能使用int 或short 表示bool类型,使用int型的程序员定义typedef int bool;使用short型程序员定义typedef short bool;但是代码中使用的是bool a;
typedef也可以定义结构体和函数 为更简单的名字。
经常在结构体定义时看到 typedef struct A{} B;使用时 B *p;
函数定义:typedef int (*pfunc)(int A,int B, int C,int D);使用时 pfunc *p;
26.常量声明为宏
程序中不要出现纯数字式的硬编码,一方面容易引起费解,另一方面可能会修改时,一改全改。
这时,可以可以将数字声明为宏。这里全局变量也可以完成此功能,但宏比全局变量具有更高的速度。
27.宏定义不要加分号
宏定义加分号后,如#define A 1024;它是在程序段中,将A替换为1024;这违反程序员本意,出现不可预料的错误。
28.||或&&的使用
express1 || express2 :当express1为真时,express2将不再执行。
express1 && express2 :当express1为假时,express2将不再执行。
这个在编译原理课程上 应该提及过吧。
这里会出现一个问题,如果express2中含有初始化指针p的操作,但是,由于express1短路时,express2未被执行,即指针p未被初始化。
但下文中,有出现引用指针p的操作,这时出现运行时错误。
另外一种情况:判断一个字符是不是有内容,即判断这个字符串指针是不为空(NULL)并且其内容不能为空(Empty);
if((strlen(p)&&(p!=NULL))) ; 这样当p为NULL时,出现运行时错误;
但 if ( ( p != NULL ) && ( strlen(p) != 0 )) 就可以利用p!=NULL为假,不再执行strlen(p),避免这种情况。
29.尽量使用for语句,而不是while语句
while语句和for语句都可以完成循环功能,但是for语句更加清晰明朗。
for(初始条件;结束条件;循环递推){}
30.sizeof类型 而不是变量
int score[100];使用sizeof(int) * 100 ,虽然sizeof(score),这样容易阅读。
sizeof经常用来分配内存空间。
31.莫忽视warning
常见warning
1.使用了隐晦声明的函数。一个函数在别的C文件中,应extern关键字声明这个函数,否则编译时会出现这种警告,及本地与外部函数分不清楚
2.没有转换一个指针,在malloc中尽量显式转换。
3.类型转换 float f=2.0;2.0是double型,把一个double转成float。修改方式float f=2.0f;
32.DEBUG和RELEASE版本
仿照VC建立debug和release两个版本,debug信息在以后维护中具有很宝贵的作用。
预编译技术
#ifdef DEBUG
void TRACE(char* fmt, ...)
{
cout<<__FILE__<<__LINE__<
debug信息;
}
#else
#define TRACE(char* fmt, ...)
#endif
如果使用debug模式,输出编译标志DEBUG内的信息,添加-DDEBUG编译选项
cc-DDEBUG -o target target.c
综上所述32条,都是为了三大目的——
1、程序代码的易读性。
2、程序代码的可维护性,
3、程序代码的稳定可靠性。
文章:http://blog.csdn.net/haoel/article/details/2873 陈皓