一.
1.给类型起别名: typedef 原名 别名;
可用于给代码更换平台:先定义别名,在代码中使用别名,这样,在移植到其他平台时,可以更换原名(用于应对linux和win的,如long等类型的,字节数不一致问题)
注:给类型起别名不是简单地展开替换字面代码,而是限定了别名就是原类型
宏定义才是字面代码层面的展开替换
二.代码的链接和编译原理
1.编译过程
1)预编译:处理 #开头的命令(#pragma.lib ,#pragma.link例外,这两个属于链接阶段)
2)编译:gcc,g++ -0
3)汇编
最后生成二进制可重定位文件 .obj
.o文件的格式组成
elf文件头
.text
.data
.bss
.symbal
.section table
...
.
2.链接过程:编译完成的所有.o文件+静态库文件(.o .a .lib)
1)所有.o文件段的合并,符号表合并后进行符号解析
所有对符号的引用,都要找到该符号定义的地方(例如错误:符号未定义,符号重定义);
符号解析成功后-->给所有符号分配虚拟地址
2)符号的重定向
把符号的地址写入指令中
链接完成之后,形成可执行文件:
.exe
.out
-o 可执行程序的名称
注:1)符号什么时候分配虚拟地址?
链接过程第一步,符号解析完成后
2) .out和 .o文件的异同
同:都由各种段组成
异: .out的 program headers段有两个load 告诉系统: 运行程序时,把数据段和代码段加载到内存中
.out文件在磁盘上的组成
elf header //程序的入口地址
profram headers //告诉系统,加载.text和 .data
.text
.data
.bss