
[原气弹]研究院
haiheng
这个作者很懒,什么都没留下…
展开
-
01、版权和版本
/************************************************************************** 文件名:network.c** 文件描述:网络通讯函数集** 创建人: Hao Chen, 2003年2月3日** 版本号:1.0** 修改记录:*****************************************原创 2004-10-11 23:46:00 · 894 阅读 · 0 评论 -
6、if 语句对出错的处理
我看见你说了,这有什么好说的。还是先看一段程序代码吧。 if ( ch >= 0 && ch /* 正常处理代码 */ }else{ /* 输出错误信息 */ printf("error ....../n"); return ( FALSE ); }这种结构很不好,特别是如果“正常处理代码”很长时,对于这种情况,最好不原创 2004-10-12 00:07:00 · 1193 阅读 · 0 评论 -
9、变量的初始化
————————接上一条,变量一定要被初始化再使用。C/C++编译器在这个方面不会像JAVA一样帮你初始化,这一切都需要你自己来,如果你使用了没有初始化的变量,结果未知。好的程序员从来都会在使用变量前初始化变量的。如: 1) 对malloc分配的内存进行memset清零操作。(可以使用calloc分配一块全零的内存) 2) 对一些栈上分配的struct或数组进行初始化。(最好也是清零)原创 2004-10-12 00:18:00 · 908 阅读 · 0 评论 -
13、函数名和变量名的命名
————————————我看到许多程序对变量名和函数名的取名很草率,特别是变量名,什么a,b,c,aa,bb,cc,还有什么flag1,flag2, cnt1, cnt2,这同样是一种没有“修养”的行为。即便加上好的注释。好的变量名或是函数名,我认为应该有以下的规则: 1) 直观并且可以拼读,可望文知意,不必“解码”。 2) 名字的长度应该即要最短的长度,也要能最大限度的表达原创 2004-10-12 00:31:00 · 2073 阅读 · 0 评论 -
18、函数参数中的const
———————————对于一些函数中的指针参数,如果在函数中只读,请将其用const修饰,这样,别人一读到你的函数接口时,就会知道你的意图是这个参数是[in],如果没有const时,参数表示[in/out],注意函数接口中的const使用,利于程序的维护和避免犯一些错误。虽然,const修饰的指针,如:const char* p,在C中一点用也没有,因为不管你的声明是不是const,指针的内容照样原创 2004-10-12 00:45:00 · 989 阅读 · 0 评论 -
8、在堆上分配内存
—————————可能许多人对内存分配上的“栈 stack”和“堆 heap”还不是很明白。包括一些科班出身的人也不明白这两个概念。我不想过多的说这两个东西。简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的原创 2004-10-12 00:15:00 · 1173 阅读 · 0 评论 -
11、出错信息的处理
—————————你会处理出错信息吗?哦,它并不是简单的输出。看下面的示例: if ( p == NULL ){ printf ( "ERR: The pointer is NULL/n" ); } 告别学生时代的编程吧。这种编程很不利于维护和管理,出错信息或是提示信息,应该统一处理,而不是像上面这样,写成一个“硬编码”。第10条对这方面的处理做了一部分说明。如果要原创 2004-10-12 00:22:00 · 1185 阅读 · 0 评论 -
15、修改别人程序的修养
———————————当你维护别人的程序时,请不要非常主观臆断的把已有的程序删除或是修改。我经常看到有的程序员直接在别人的程序上修改表达式或是语句。修改别人的程序时,请不要删除别人的程序,如果你觉得别人的程序有所不妥,请注释掉,然后添加自己的处理程序,必竟,你不可能100%的知道别人的意图,所以为了可以恢复,请不依赖于CVS或是SourceSafe这种版本控制软件,还是要在源码上给别人看到你修改程原创 2004-10-12 00:42:00 · 1367 阅读 · 1 评论 -
22、宏的使用
——————很多程序员不知道C中的“宏”到底是什么意思?特别是当宏有参数的时候,经常把宏和函数混淆。我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。这个动作术语叫“宏的展开”使用宏是比较“危险”的,因为你不知道宏展开后会是什么一个样子。例如下面这个宏: #def原创 2004-10-12 00:52:00 · 1118 阅读 · 0 评论 -
VC快捷键
VC快捷键F1: 帮助 Ctrl+O :OpenCtrl+P :PrintCtrl+N :NewCtrl+Shift+F2 :清除所有书签F2 :上一个书签Shift+F2 :上一个书签Alt+F2 :编辑书签Ctrl+F2 :添加/删除一个书签F12 :Goto definitionShift+F12 :Goto referenceC原创 2004-10-19 10:33:00 · 856 阅读 · 0 评论 -
炼功常见问题
1.声明函数时忘记写”;”号原创 2004-10-19 15:54:00 · 667 阅读 · 0 评论 -
5、对系统调用的返回进行判断
——————————————继续上一条,对于一些系统调用,比如打开文件,我经常看到,许多程序员对fopen返回的指针不做任何判断,就直接使用了。然后发现文件的内容怎么也读出不,或是怎么也写不进去。还是判断一下吧: fp = fopen("log.txt", "a"); if ( fp == NULL ){ printf("Error: open file error/n"原创 2004-10-12 00:00:00 · 964 阅读 · 0 评论 -
4、函数的[in][out]参数
要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查,这个动作当然应该在函数的外部,也就是说,调用完一个函数后,应该对其传出的值进行检查,一种更好的技术是使用断言(assert),原创 2004-10-11 23:54:00 · 1710 阅读 · 0 评论 -
17、表达式中的括号
如果一个比较复杂的表达式中,你并不是很清楚各个操作符的忧先级,即使是你很清楚优先级,也请加上括号,不然,别人或是自己下一次读程序时,一不小心就看走眼理解错了,为了避免这种“误解”,还有让自己的程序更为清淅,还是加上括号吧。比如,对一个结构的成员取地址: GetUserAge( &( UserInfo->age ) );虽然,&UserInfo->age中,->操作符的优先级最高,但加上一个括原创 2004-10-12 00:44:00 · 935 阅读 · 1 评论 -
7、头文件中的#ifndef
——————————千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: #ifndef #defin原创 2004-10-12 00:11:00 · 2311 阅读 · 2 评论 -
12、常用函数和循环语句中的被计算量
—————————————————看一下下面这个例子: for( i=0; i GetLocalHostName( hostname ); ... } GetLocalHostName的意思是取得当前计算机名,在循环体中,它会被调用1000次啊。这是多么的没有效率的事啊。应该把这个函数拿到循环体外,这样只调用一次,效率得到了很大的提高。虽然,我们的编译原创 2004-10-12 00:24:00 · 918 阅读 · 0 评论 -
14、函数的传值和传指针
————————————向函数传参数时,一般而言,传入非const的指针时,就表示,在函数中要修改这个指针把指内存中的数据。如果是传值,那么无论在函数内部怎么修改这个值,也影响不到传过来的值,因为传值是只内存拷贝。什么?你说这个特性你明白了,好吧,让我们看看下面的这个例程:voidGetVersion(char* pStr){ pStr = malloc(10); strcpy ( p原创 2004-10-12 00:41:00 · 1399 阅读 · 0 评论 -
16、把相同或近乎相同的代码形成函数和宏
—————————————————————有人说,最好的程序员,就是最喜欢“偷懒”的程序,其中不无道理。如果你有一些程序的代码片段很相似,或直接就是一样的,请把他们放在一个函数中。而如果这段代码不多,而且会被经常使用,你还想避免函数调用的开销,那么就把他写成宏吧。千万不要让同一份代码或是功能相似的代码在多个地方存在,不然如果功能一变,你就要修改好几处地方,这种会给维护带来巨大的麻烦,所以,做到“一原创 2004-10-12 00:44:00 · 954 阅读 · 0 评论 -
19、函数的参数个数(多了请用结构)
—————————————————函数的参数个数最好不要太多,一般来说6个左右就可以了,众多的函数参数会让读代码的人一眼看上去就很头昏,而且也不利于维护。如果参数众多,还请使用结构来传递参数。这样做有利于数据的封装和程序的简洁性。也利于使用函数的人,因为如果你的函数个数很多,比如12个,调用者很容易搞错参数的顺序和个数,而使用结构struct来传递参数,就可以不管参数的顺序。而且,函数很容易被修改原创 2004-10-12 00:47:00 · 2911 阅读 · 0 评论 -
20、函数的返回类型,不要省略
——————————————我看到很多程序写函数时,在函数的返回类型方面不太注意。如果一个函数没有返回值,也请在函数前面加上void的修饰。而有的程序员偷懒,在返回int的函数则什么不修饰(因为如果不修饰,则默认返回int),这种习惯很不好,还是为了原代码的易读性,加上int吧。所以函数的返回值类型,请不要省略。另外,对于void的函数,我们往往会忘了return,由于某些C/C++的编译器比较敏原创 2004-10-12 00:49:00 · 1987 阅读 · 0 评论 -
21、goto语句的使用
—————————N年前,软件开发的一代宗师——迪杰斯特拉(Dijkstra)说过:“goto statment is harmful !!”,并建议取消goto语句。因为goto语句不利于程序代码的维护性。这里我也强烈建议不要使用goto语句,除非下面的这种情况: #define FREE(p) if(p) { / free(p); /原创 2004-10-12 00:51:00 · 1325 阅读 · 0 评论 -
2、缩进、空格、换行、空行、对齐
.原创 2004-10-11 23:46:00 · 1117 阅读 · 0 评论 -
3、程序注释
.不要以为注释好写,有一些算法是很难说或写出来的,只能意会,我承认有这种情况的时候,但你也要写出来,正好可以训练一下自己的表达能力。而表达能力正是那种闷头搞技术的技术人员最缺的,你有再高的技术,如果你表达能力不行,你的技术将不能得到充分的发挥。因为,这是一个团队的时代。/****************************************************************原创 2004-10-11 23:53:00 · 962 阅读 · 2 评论 -
逐段注释--最简单,最方便,最快速,最实用,最高效,最清晰,最直接,最好的调试方法
原创 2004-12-15 11:44:00 · 2029 阅读 · 7 评论