c语言第三讲 程序环境和预处理
2021-10-24 本文已影响0人
大旺旺的弟弟小旺旺
程序的两种状态: 编译和链接过程
编译分为四大过程:
- 预处理
- 编译
- 汇编
- 链接
代码的两种状态
- 翻译环境:源代码转换为机器指令
- 执行环境:用于可以执行的代码
编译和链接过程
源代码被编译器编译为目标文件,然后给链接器,链接器会将链接的库和目标一起链接为一个可执行文件。
- 预处理:
完成宏替换,文件引入,去除空行注释等
也就i是对各种预处理命令进行 处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。
gcc -E test.c -o test.i
-E:完成预处理之后,停止后面的操作
-O:重定义,预编译之后输出的选项
- 编译 :语法分析 语义分析
目标即使将预编译之后的代码变为汇编的过程,他会检查代码的规范性,是否有语法错误
编译执行的时候,先分析词法 语法 语义 中间代码
gcc -S test.c -o test.s
-S:在便编译之后停止后面的操作
- 汇编:汇编之后将结果放入到.o文件中(汇编变为二进制)
gcc test.s -o test.o
链接就是将中间文件和库文件生成目标文件的过程。
链接
gcc test.o -o test
./test //执行
···
## 程序执行的过程
- 程序载入内存中,一般通过操作系统完成,
- 程序开始执行的时候,调用main
- 开始执行代码:程序使用一个运行时堆栈,存储变量和返回地址
- mian执行完成退出
## 预处理
预处理的符号
- __FILE__:编译的源文件
- __LINE__:当前的行号
- __DATE__:编译的日期
- __TIME__:文件编译的时间
可以做如下操作:
```c
printf("line num %d",__LINE__)
标识符
- #define
#define MAX 1000 定义一个值
#define i int //起别名
#define p printf("%d",109);
- 定义宏
#define name(i) i*i
举个例子
#sq(x) x*x
int main(){
sq(3+1); //实际3+1*3+1
}
可以理解将后面的原封不动的复制过去。
宏和函数的区别
宏用来执行简单的运算,代码长度较短的。宏的执行速度更快,并且可以是不同的参数类型。但是宏的确定就不是不可以调试,与类型无关,不严谨,并且有优先级问题
条件编译
编译一个程序的时候,需要放弃某个语句
#if
#end if
举例
#define _DEBUG_ 1
#if _DEBUG_
#endif