1、程序编程风格
在写程序时,有个良好的编程习惯,对自己对别人都有好处。华为的编程规范就很不错,可以借鉴,没必要完全模仿。看别人代码往往是很折磨人的,如果自己的代码不用注释也能让别人清晰明确了解,不仅节约别人时间,也可以免去自己被打扰。
a、 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。尽可能给出描述性名称,不要节约空间,让别人很快理解你的码更重要。其中有些单词是大家公认的缩写,常用单词的缩写必须统一。协议中的单词的缩写与协议保持一致。对于某个系统使用的专用缩写应该在注视或者某处做统一说明。
示例:一些常见可以缩写的例子:
argument 可缩写为 arg
buffer 可缩写为 buff
clock 可缩写为 clk
command 可缩写为 cmd
compare 可缩写为 cmp
configuration 可缩写为 cfg
device 可缩写为 dev
error 可缩写为 err
hexadecimal 可缩写为 hex
increment 可缩写为 inc、
initialize 可缩写为 init
maximum 可缩写为 max
message 可缩写为 msg
minimum 可缩写为 min
parameter 可缩写为 para
previous 可缩写为 prev
register 可缩写为 reg
semaphore 可缩写为 sem
statistic 可缩写为 stat
synchronize 可缩写为 sync
temp 可缩写为 tmp
b、文件命名统一采用小写字符
全局变量应增加“g_”前缀。
静态变量应增加“s_”前缀。
避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过
4
层。
c、 一个函数仅完成一件功能
重复代码应该尽可能提炼成函数。 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。
d、程序不要直接使用魔鬼数字。而关于使用宏,应尽可能使用函数代替宏定义的运算,尽量使用const定义代替宏,方便变量跟踪。
e、 所有的if ... else if结构应该由else子句结束 ;switch语句必须有default分支。
f、 时刻注意表达式是否会上溢、下溢。
1、先say hi
每个程序运行都一个默认入口函数,c语言中默认的入口函数就是main。至于为什么一定要是main,没有一定,只是语言设计的时候已经约定好的事。
一个程序从源码到可执行文件,必须经过 C源程序->编译预 处理->编译->优化程序->汇编程序->链接程序->可执行文件 这样的流程。
下面先写个最简单的程序。逐步的分析。
这就是源码阶段。这部分由程序员决定。
虽然很简单,但很多人在写main的时候根本不会去考虑对函数的参数检查,或直接忽视参数,这样不是很安全。上面的宏,只是为了测试,实际应用中不能这样写。
.编译预处理 读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。在这一步中,会对宏定义指令、条件编译指令、头文件包含指令(预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,源程序就算只是添加stdio.h文件头也会增加几百行代码)、特殊符号(例如在源程序中出现的LINE标识)进行还原。
和上面对比,里面的宏已经被替换掉了。头文件呢,太长了,看下面提示的行数就知道了。
这条命令将预文件编译成汇编,文件如果不指定,那么会生成同名的文件后缀为.s。这部分是由系统的编译工具也就是gcc内部策略决定汇编代码的样子。
虽然预编译的内容长度很吓人,编译出来的汇编代码并不多。
gcc -O 指定优化处理
-O0不优化 -O1或-O 一级优化 -O2 二级优化...-O3,-O4
级别越高,,代码越优,编绎时间越长。
这个步骤就是优化前面生成的汇编文件的源码,同时生成目标文件,一次性完成了汇编过程和链接以及生成执行文件过程。
其中,优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
而汇编处理实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码,也就是二进制码。
至于链接过程, 一般都会默认链接系统的底层库glibc,这是一个很庞大的c函数库,分布在系统的目录结构中。在配置完善的环境中编程,很多细节程序根本就不用考虑。当程序编译链接的时候 加上 -nostdlib不要使用标准库的时候,再简单的程序也会大量的提示错误。出现大量的重定义,这就是和标准库之间的冲突。
来个简单的hello world。这个就写到这,以后再补充。