翻译环境
1.当我们写代码生成test.c源文件时,电脑会经过翻译环境生成可执行的test.exe的可执行文件,继而通过运行环境开始运行
2.翻译环境分为编译环境和链接
编译环境和链接
1.每个源文件单独经过编译器处理,生成xxxx.obj的目标文件
2.所有目标文件经过链接器链接生成可执行文件,同时链接链接库
预编译 编译 汇编
1 编译又分为预编译,编译,汇编
2 预编译的功能——文本操作,预处理指令
2.1 stdio 头文件的包含
2.2注释的删除
2.3#define定义符号的替换
3编译:把c语言翻译成汇编代码
3.1语法分析
3.2词法分析
3.3语义分析
3.4符号分析
4汇编:把汇编代码转化为二进制指令
4.1形成符号表
链接
1 合并段表
2 符号表的合并和重定位
运行环境
1 程序载入内存中,一般由操作系统完成
2 程序执行开始,调用main函数
3 执行程序代码,使用一个运行时堆栈(stack),存储函数的局部变量和返回地址,使用一个静态(static)内存,存储静态内存中的变量,并在程序执行过程中一直保存它们的值
4 终止程序
预定义符号
FILE 进行编译的源文件
LINE 文件当前的行号
DATE 文件被编译的日期
TIME 文件被编译的时间
STDC 如果编译器遵循ANSI C ,其值为1,否则未定义
预处理指令 以#开头
#define
1 定义表示符
2 定义宏
2.1定义宏带有参数,运行的时候把参数替换到文本中
2.2宏在替换的时候是把参数不经任何处理替换到文本中,不是计算完结构再替换
2.3宏定义不支持递归
2.4宏定义在遇到字符串的时候不会替换
#include<stdio.h>
#define square(x) x*x
int main()
{
printf("%d", square(3));
}
特例:结果为11
#include<stdio.h>
#define square(x) x*x
int main()
{
printf("%d", square(3+2));
}
为保证结果为整体
#include<stdio.h>
#define square(x) (x)*(x)
int main()
{
printf("%d", square(3+2));
}