数据在内存中的存储
从源码到执行
- 编译环境: 编译–>链接
编译分为:预处理(预编译)–> 编译 –> 汇编 –>链接
每个源文件单独编译 ,生成对应 .obj 目标文件。
预处理(-E): 对头文件的包含、对注释的删除、对宏定义符号的替换,对应.i文件
编译(-S): 把源代码转换成汇编代码,在此过程中进行语法分析、 词法分析、语义分析、符号汇总,对应.s文件
汇编(-c): 把汇编代码转换成二进制指令,形成符号表,对应.o文件
gcc指令:
-o:指定生成的输出文件;
-E:仅执行预编译;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。
链接是将各个目标文件整合在一起,链接成一个 .exe 可执行文件。
对符号表的合并和对符号的重定位, 合并段表(elf)
- 运行环境
预定义
几个特殊的预定义符号
1.__FILE__ 进行编译的源文件
2.__LINE__ 文件当前的⾏号
3.__DATE__ 文件被编译的⽇期
4.__TIME__ 文件被编译的时间
5.__STDC__ 如果编译器遵循ANSI C,其值为1,否则未定义
预处理操作符
1.# 将宏转换为字符串
#include<stdio.h>
#define PRINTF(x,format) printf("The value of " #x " is " format "\n", x);
int main()
{
int a = 10;
PRINTF(a,"%d");
return 0;
}
//输出结果:
the value of a is 10
2.## 把宏定义中参数的符号合并为一个符号
#define CAT(x, y) x##y
int value=20;
printf("%d", CAT(va, lue));
//输出结果:
20