最近996,没有大块时间学习。
C文件的执行过程
预处理: .C文件 --> .i文件 的过程 命令 gcc -o hello_world.i hello_world.c -E 生成 预处理文件 由编译器完成
#define R=3.141592653;
预处理阶段对 宏定义 只是字符串层面的替换,计算机不会考虑语法上的错误
#define MAX(a,b) (a>b?a:b);
宏定义的作用:使用更加灵活,如 MAX(a,b) a,b并未指定参数类型,int,folat等数据类都可以使用 MAX(a,b) 的宏定义
预编译: .i 文件 --> .s文件
此阶段完成语法和语义分析,然后生成中间代码,此中间代码是汇编代码,但是还不可执行,gcc编译的中间文件是[.s]文 件。在此阶段会检查各种语法和语义错误,特别要小心未定义的行为,这往往是致命的错误。由编译器完成
汇编:.s文件 --> .o文件
此阶段主要完成将汇编代码翻译成机器码指令,并将这些指令打包形成可重定位的目标文件,[.O]文件,是二进制文件。此 阶段由汇编器完成。
链接:.o 文件 --> 可执行文件
此阶段完成文件中叼用的各种函数跟静态库和动态库的连接,并将它们一起打包合并形成目标文件,即可执行文件。此阶段由链接器完成
结构体大小计算方法:
union User{
int age;
char sex;
double weight;
}
//union 共用体 成员共用一块内存,其大小由最大成员所占字节决定 User=8 个字节
struct student{
long a;//偏移量=0
int b;//偏移量=8,当前成员所占字节是4,8是4的整数倍 不需要 填充字节数
char c;//偏移量=8+4,当前成员所占字节是1,12是1的整数倍 不需要 填充字节数
float d;//偏移量=8+4+1,当前成员所占字节是4,13不是4的整数倍,16是>13的最小倍数需要在 c,d之间 填充3个字节
}
所以 student = 最后一个成员的偏移量 + 最后一个成员的大小 + 填充数 =13+4+3=20 然后
需要判断 student的字节数是否是其最大成员 a(8个字节) 的整数倍不是的话需要补齐 20%8!=0即还需补4个字节,最后 student的实际大小= 20 +4 = 24个字节