一.程序的翻译环境和执行环境
在ANSI C的任何一种实现中,存在两个不同的环境
- 翻译环境,此过程中源代码转换为可执行的机器指令
- 执行环境,它用于实际执行代码
二.编译和链接的过程
三.编译的几个阶段
1.形成符号表的过程:
2.段表的合并和重定位随后进行链接:
四.运行环境
程序执行的过程:
程序必须载入内存中。在有操作系统的环境中,这个操作一般由操作系统完成。在独立的环境中必须手工完成,也可能是通过可执行代码置入只读内存来完成。
程序的执行便开始,接着调用main函数
开始执行程序代码,这个时候程序将使用一个运行的堆栈,存储函数的局部变量和返回值。程序同时也可以用静态内存,存储在静态内存中的变量在程序的整个执行过程中一直保留它们的值
五.预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
六.define/undef
define的两个用法:
- 定义符号(标识符)
- 定义宏
undef:用于移除宏定义
1.define定义符号时,语法要求:
- 不要加上 ;
- 一般情况下大写
2.define定义宏时,语法要求:
- 注意要加入括号,防止整体替换时次序发生变化
七.#define替换规则
八.#和##的应用
1.#作用:把一个宏的参数变成对应的字符串
2.##的作用: 可以把位于其两端的(分离片段)符号合成一个符号
九.带副作用(功能)的宏参数
十.宏与函数的对比
1.宏的优点:
1.小型工作时反应速度更快
2.不需要指定特定类型(宏是类型无关的)
2.宏的缺点:
1,用一次,会在文本中插入一次代码
2,无法调试
3,与参数类型无关,不够严谨
4,可能存在运算符优先级的问题
3.宏能做到而函数做不到的例子:
4.宏和函数全面对比一览:
十一.条件编译(预处理指令)
例如:
1.预处理指令和普通判断语句的区别:
- 预处理指令在预处理阶段就将不要的代码删除
- 后面都要跟一个endif收尾
2.常见的条件编译指令:
- 普通条件编译:if/endif
- 多分支的条件编译:if/elif/else/endif
- 判断是否被定义
if defined(symbol)/ifdef symbol if !defined(symbol)/ifndef symbol
- 嵌套指令
十二.文件包含过程
- " " 查找两次
- < >查找一次
1.例题: include"test.h"与include <test.h>有什么区别?
答:两者查找策略不同
十三.解决嵌套头文件包含问题
在进行大项目制作时,常常会出现如下情况:comm.h同时通过左右被重复包含,造成冗余
1.两种解决方案:
- prama once(编译器创建头文件时有时候会默认加)
- 条件编译
2.例题:头文件中的ifndef/define/endif是干什么用的?
答:防止头文件被重复包含