C语言, 值得终身使用的编程工具(三)――――使用建议

原创 2004年07月18日 16:25:00

多年来使用C语言,积累了一些经验,林林总总,有具体的一些技巧,也有一些是涉及软件工程的内容,有些东西不仅仅适用于C语言,对于其它语言也同样适用。主要还是想从不同的角度来提出一些建议;对于具体的一些程序技巧例如指针、printfscanf等,我会在另外的一个专题中具体叙述。

    我相信无论是资深的程序员还是初学者都有自己的对C的独到认识和使用技巧,我先抛出几块砖,希望能引出大家的玉。

1.       全局变量的使用

对于全局变量的使用要慎之又慎,尤其是涉及全局指针。为什么要使用全局变量呢?因为全局变量可以非常方便地实现各函数间的数据交换。同时也就意味者在程序的任何一点都可以访问访问它。因此,全局变量虽然使用方便,但容易失控。在实际的情况中,程序经常是不按照我们“设想”的步骤运行。若控制程序运行的点不被控制,程序会经常崩溃或是不能得到正确的结果。从开始编程到开始,我就有过若干次因为全局变量而失控的经验。最近的一个例子是:

需要操作一些特殊相同格式的文件,文件中记录的长度需要传递到bsearch的比较函数中,而bsearch需要的比较函数已经固定int (*compar)(const void *, const void *)。为了简化起见,在申请处理文件结构的同时,定义了一个全局的指针来指向处理文件的结构地址。这段代码运行了大半年都没有问题。但我当我用它来打开多个文件时,程序有时会core dump。仔细检查才发现,每个文件都有自己的不同处,虽然为每个文件都申请了一个结构,但全局指针指向的却是最后一个打开的文件,自然就会出问题。

在处理数据库或文件时,我经常看见在很多代码的头部,声明了一堆全局变量来处理记录的字段,这种做法应该完全被禁止。

合理地使用全局变量可以使程序简洁。例如,我自己常常使用的分级日志函数:writeLog(int loglevel, char* fmt, …); 内部使用了全局变量struct SLevelLog* G_pLog。在程序中,可以很方便地调用writeLog来写日志。当然日志的目的文件只能是唯一的。

对于一些不变的字符串等,全局变量是一个很好的选择。例如Http协议所定义返回值对应的字符串数组:

static char *Http_ReasonPhase[]=

{

    "Continue",

    "SwitchProtocols",

    "OK",

    "Created",

    "Accepted",

}

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

总结了一些使用全局变量的原则:

a.       全局变量是使程序简洁,在保持简洁的同时不能使程序的逻辑发生混乱。特别是程序中需要根据某些状态来决定程序的流程时。

b.       全局变量处理的内容最好具有唯一性。

c.       需要使用多个全局变量时,最好把这些全局变量都封装在一个结构中。

d.       自定义的库中最好不要包括全局变量。

 

2.      

a.       建立基础库

由于C语言的标准库所提供的功能不足,因此非常有必要建立基础库。首先是能够处理任意类型的基本数据结构:双向链表、tablehash、树等;其次是分级日志,缓冲区操作与分析、常用编码解码、C不提供的字符串分析等。

有了这些基本的数据结构,整个系统就有了基础。

b.       建立核心库

只有基础库是远远不够的,在写应用的过程中,还应该不断等抽象出核心库。例如数据库操作、文件操作、XML解析、ASN.1编码解码、网络操作等。

核心库具备后,分析和设计的能力也就初步具备。

c.       应用库

在应用中常用的用户管理、资料管理、已经常用的操作等等都应该及时地封装成为库。增加代码的重用性,提供开发效率和质量。

d.       函数的命名

提供一种命名方法供参考:

对于同一组函数定义一个短前缀(25个字符),使用_和具体的操作连起来。例如:

双向链表:

SDBList* dl_create(freeFunc myFree);

inline void* dl_head(SDBList*);

inline void  dl_insert_tail(SDBList*,void*);

 

HASH:

SHashHead* ha_create(u_long hsize,hashFunc hfunc,compareFunc cmp,freeFunc myFree);

inline void* ha_insert(SHashHead* head,void* ptr);

 

ASN.1的分析

SAsn1* asn_create();

SAsn1Tag* asn_build(SAsn1* p,u_char tag,void* buf,int len);

这样的方法可以减少命名的重复,同时又增强了同类函数之间的聚合性,使用起来也不容易出错。

e.       测试

库作为整个系统运行的基础,对库测试的重要性无需多说。

f.        题外话

在一个比较复杂的项目中,程序能力最强的人负责基础库和核心库,对业务和编程都比较熟的人复杂应用库,一般的程序员复杂具体的业务逻辑,这样做一般都能保证项目的顺利实施和技术的积累

             

3.       面向对象的思维方法和以关键结构为核心的方法

关于这两点已经在前文介绍了,这里就不重复了。从例子可以看出,我自己坚定地拥护和执行这两个方法。

4.       “尝试”代码

在使用新的函数、新的思路或对某些语法、技巧把握不住的情况下,我常常会先写一段较短的代码,来熟悉函数的使用方法、验证新思路、掌握一些方法和技巧。

5.       保持一颗“简洁”的心

      在UNIX世界中有一句非常著名的话“简洁就是美”。简洁不是单纯意义上的代码数量少,简洁同时也代表着语法简单、结构清晰、思路正确,让人一目了然。否则就只有苍白,那里还有美

C语言, 值得终身使用的编程工具

转自:tfisher的专栏http://blog.csdn.net/tfisher/archive/2004/07/09/37707.aspx     职业程序员10来年了,其中的酸甜苦辣真是只有过来...
  • perddy
  • perddy
  • 2008年02月02日 22:22
  • 786

C语言, 值得终身使用的编程工具(二)―――― “秘密”

1.       面向对象的编程思想 当时自以为C还是学得不错的,各种语法都用得挺熟,什么指针、移位、指针数组等等。但实际应用中,用C写的程序的规模并不大,经常觉得对程序没有控制感,程序也不灵活、出错...
  • tfisher
  • tfisher
  • 2004年07月13日 13:54
  • 1921

C语言, 值得终身使用的编程工具(一)

    做职业程序员10来年了,其中的酸甜苦辣真是只有过来人才能体会。身处计算机技术高速的发展的时代中,确实感觉累,特别是在选择编程工具时,新的语言和可选择的语言太多。若立志作为一个职业的并愿意深入研...
  • tfisher
  • tfisher
  • 2004年07月09日 12:34
  • 2283

C语言基础:C语言结构体(7) - 结构体的嵌套使用

上一节, 我们讲解了结构体与函数, 这次我们来讲解一下结构体的嵌套使用. 比如有一个学生, 我需要知道他的学号, 生日年月日, 入学年月日, 如果用结构体我们需要怎么做呢? 按照常规的定义, ...
  • qq350116542
  • qq350116542
  • 2015年01月10日 14:06
  • 511

有用的C语言工具(Ubuntu Linux版本)

《C专家编程》里的第六章介绍了一些有趣&有用的C语言工具。可能因为此书写成年代距今已远且目标为SunOS这个Unix系统,有些工具在我的Ubuntu中是无法使用的。因此我简单测试了一下,总结了这些能在...
  • jubincn
  • jubincn
  • 2012年02月22日 19:28
  • 2115

C语言使用建议

转自:tfisher的专栏http://blog.csdn.net/tfisher/archive/2004/07/18/44361.aspx       多年来使用C语言,积累了一些经验,林林总总...
  • perddy
  • perddy
  • 2008年02月02日 22:26
  • 606

三子棋游戏(c语言实现)

一说到写个三子棋游戏,首先我们得想到有个棋盘初始化和棋盘打印函数。 接下来,玩游戏阶段,人玩游戏,电脑玩游戏,各写一个函数,每次下完棋都得判断有没有人赢了游戏,若有人赢了,游戏退出,否则继续游戏。在这...
  • peiyao456
  • peiyao456
  • 2016年03月28日 23:01
  • 2195

三个数比较大小——C语言经典题目

这道题是每一位初学C的小伙伴们的必经之路,其经典性简直如同Hello World!下面写一下几种不同的解法。 1.if语句 2.三目运算(?) 3.调用函数 4.指针...
  • Outins
  • Outins
  • 2017年03月29日 20:57
  • 10037

C语言实现3个数的最小公倍数和最大公约数

根据求两个数的最小公倍数和最大公约数的方法求3个数的最大公约数和最小公倍数。 主要的思想就是利用a%b==0&a%c==0这样的来判断是否满足,再利用循环计数即可。#include int main...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2015年06月30日 22:36
  • 2841

【C语言】编程工具--GNU的使用

Linux下编译器的使用 1.-S 产生汇编代码 Unix>gcc-02 –S code.c   生成code.s 2.-c 汇编成二进制文件 Unix>gcc –O2 –c code.c  ...
  • chenglibin1988
  • chenglibin1988
  • 2011年01月08日 18:08
  • 353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言, 值得终身使用的编程工具(三)――――使用建议
举报原因:
原因补充:

(最多只允许输入30个字)