感悟《C和指针》——2.基本概念

一. 环境
     每个ANSI C的实现都存在着两种不同的环境,一种叫“翻译环境”,一种叫“执行环境”,前者代表源代码文件被翻译成可执行文件所在的环境,而后者代表翻译生成的可执行文件的执行环境。两个环境并不要求一定要一致,比如嵌入式开发中的交叉编译,就是在环境A中编译链接可以在环境B中运行的可执行文件。这两种环境使用的指令集架构不一定相同。
1. 代码翻译
     代码的翻译由“编译”和“链接”两个阶段组成。编译阶段本身也包含多个步骤。编译的第一个步骤是预处理器(Preprocessor)的处理,预处理器执行一些文本操作,比如将#define指令定义的符号替换成所定义的值,将#include包含的头文件内容插入包含的文件中。
     然后,源代码经历一个解析(parse)的过程,这个阶段是产生绝大多数错误和警告的地方。随后生成目标代码(.o文件),如果我们在编译命令中要求对代码进行优化(比如-O选项),那么优化器(optimizer)就会对目标代码进一步优化。
     最后进入链接阶段,链接器(linker)把生成的各个目标文件,连同程序需要的库函数链接成可执行文件。比如我们的程序使用了ncurses库,我们就加上参数“-lncurses”进行链接。
     对于C语言,头文件的后缀名一般是.h,而源代码文件则是以.c结尾的。
编译链接过程

2.程序执行
     程序的执行也分为几个阶段。首先,程序由操作系统载入内存中,那些并非存贮于运行时堆栈中的变量(比如用static定义的变量)会被初始化。然后程序将与一个小型的启动程序链接在一起,接着调用main函数。现在便开始执行程序代码,程序将使用一个运行时堆栈来调用函数(传递参数,存储局部变量和返回地址)。最后程序执行完毕并终止。

二. 词法规则
     除了常用的字符集以外,我们要注意C语言中几个方面:三字母词、转义序列、注释和保留字。三字母词以两个“?”开头,用于表示某些字符集中不包含的字符,比如“??<”代表“{”,我们不会经常见到三字母词,但要小心,不要让代码产生让我们莫名其妙的符号。转义序列用于在某些环境中将有特殊作用的字符解析为其字面值,比如双引号”代表字符串的开始或者结束,如果我们要在字符串中包含双引号,我们就用反斜杠\对其进行转义,如\"。对于注释,我们要小心的是——注释是不能嵌套的。保留字是C语言中有特殊含义的标记,如for,while和if等,是不能用作变量名的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值