情况,将简称为“参照相关资料”。相关资料中,至少包含以下4方面内容:
·C语言国际标准;
·你所使用编译器的产品手册;
·你所使用编译器的基础库手册;
·你所使用操作系统提供的C语言接口库手册。
注意 以上四方面,一切以C语言国际标准为基准。或许3~5年的一个C语言应用阶段,你一直使用同一个编译器针对同一个目标操作系统进行开发,但你不能保证在随后10年、20年的开发工作中所
用的编译器和针对的目标操作系统始终不变。对于有出入的内容,需要非常注意,在系统原型设计阶段,尽可能地回避编译器的特性。在系统优化阶段,再针对特定目标系统,借助编译器/操作系统接口库
的特性内容来提升你的程序性能。对不属于C语言标准库的内容,则应尽可能地选择那些符合国际标准的协议、规则、规范(如POSIX协议)的部分。
在展开本章讨论之前,围绕C语言的开发,此处给出一些本书作者(本书后续简称“我”)的个人建议。
建议1:
区别于那些“更高级”的计算机编程语言,C语言的设计,从你刚开始入行时就应该有一个意识:“基于C语言的程序开发项目,应当分为系统原型开发阶段和目标平台优化阶段”,前者在利用C语言
本身,后者在发挥特定目标平台的优势。前者关注系统的内在逻辑,后者关注平台的具体特性。但不同的目标平台可能差异较大,如果需要发挥它们的优势,可能存在特定的数据组织策略,这些策略需要
在前期阶段进行逻辑验证,因此这两个阶段也不是完全可隔离的。其他“更高级”的语言,并不太关注硬件、平台特性,而C程序员应当多了解目标系统(硬件以及操作系统)的运行机理。
建议2:
C语言的设计开发,尽可能地在类UNIX(UNIX的各种演化版本)或Linux(参照UNIX在PC上实现的操作系统,其不属于类UNIX)下而非Windows平台之上进行,并优先学习这类操作系统及面向这
类操作系统开发的技巧。C语言诞生在UNIX之上,最初的目的又是为了设计UNIX操作系统本身,因此C语言和类UNIX以及Linux具有很好的结合性。
相对而言,将Windows下编写带有Windows特性的C语言程序移植到类UNIX或Linux下,其工作量远大于类UNIX或Linux之间的相互移植的工作量,也大于将类UNIX或Linux下开发的C程序移植到
Windows下的工作量。这里也建议那些一线的教育工作者,如同讲解汇编最好结合计算机组成原理一样,教授C语言的知识,最好结合类UNIX或Linux操作系统一并讲解。
如果你是一个尚未在类UNIX或Linux下开发的C语言初级程序员,则建议你应尽快熟悉并掌握某个类UNIX以及Linux的操作系统。例如,Mac OS X就是稳定且具有良好应用界面的类UNIX系统。本书
中的所有C语言程序,包括我近年的C语言工程开发均在一台MacBook Pro上完成。而基于Linux内核的操作系统选择也很多,例如,早年我曾在Ubuntu下进行C语言的开发。
建议3:
除特定开发目标(如针对某特定硬件系统所设计的特定开发工具平台),正常的C语言设计应在代码编辑器下编辑,在命令行下调用脚本、make等工具开展工作,而非使用某种无目标系统特性的集成
开发环境(Integrated Development Environment,IDE)。
集成开发环境主要包括编辑器、编译器、调试器和图形用户界面工具等。一些诸如Sublime Text等第三方编辑器的性能优良,比具有同样编辑功能的IDE更为轻巧。而长期使用某种IDE,会逐步忽略了
该环境对C代码组织上的特殊性(对于初学者甚至不了解这些特殊性),这会对以后调整C语言的开发环境有很多不利影响;采用断点、跟踪的调试器并不适用于连续运行下的各种情况跟踪(后续会在第2
章展开讨论);单纯的编译器对于C语言开发并不足够,这需要make和shell脚本等其他工具组成的工具链(后续会在第3章展开讨论)来提高你的工作效率;基于C语言的设计目标极少有针对图形应用界
面的设计,因此图形界面的设计任务使用C语言开发并不适合。
我最初在Turbo C的IDE和visio C++下学习C语言并设计程序,它们易于初学者上手,但“严重”阻碍初学者对C语言工程开发设计方法的掌握及应用。一种较为“偏激”的说法,如果你使用IDE写C
程序,则你仅仅是在写C语言的程序,而不是在利用C语言按照工程化的组织方式开发一个系统。每个团队基于自身的业务背景、设计目标,会使用C语言、脚本等工具去构建和完善自身的工具包,组织成
工具链,帮助自身提高C程序设计的效率。用C语言开发工具服务于C语言的开发,这是C语言程序员应当具备的能力。
建议4:
除非你参与开源项目或希望你的设计目标以开源方式推广,否则更建议初级程序员使用“传统”的版本控制软件。此处“传统”指按照集中化管理的版本控制理论设计所开发出的版本控制软件,典型
的如CVS、SVN、Perforce等。非“传统”的,如目前在各个开源社区中流行的Git。此处并非说后者不好。一个产品,包括未来你所要设计的系统,“好”与“不好”都需要基于具体的应用场景来讨论。
团队内高度协同的开发和基于开源社区(全球化)的开发,在分工组织模式上差异很大。后者极少出现两个程序员针对同一个C文件密集地进行修正调整(这需要以天或半天为单位,相互合并对方最新的
代码),而在团队开发中,这种事情并不少见。我尊敬并赞赏那些为开源软件做出贡献的程序员,但作为初级程序员的你,我更建议你先在集群管控的团队下锻炼好自身的开发能力,再去学习开源系统的
设计方法和使用面向开源软件开发的特有工具去参与开源软件的设计。
上述4条,仅仅是我个人的建议,既不是“标准”,也不是“守则”,与本书后续针对模块化设计所探讨的“规则”一样,它们只是建议,当然这些建议和规则有效帮助了我个人的开发工作,它们是否
适合你,需要你自己的思考和实践。
1.1 C的编译链接与文件引用
1.1.1 一个小程序
我不知道以下的程序是否算作最简的C语言程序,但它足够小,同时包含了很多初级程序员忽略的内容。代码如下:
int main(int argc ,char *argv[]){
return argc;
}
上述程序存储为C文件前,我们先按照以下命令组织磁盘目录。
mkdir test
cd test
mkdir src
mkdir inc
mkdir obj
mkdir bin
评论