1.翻译环境与执行环境
翻译环境:将高级程序语言转化为机器语言的环境
执行环境:执行转换为机器语言的环境
2.翻译环境过程
1.预处理:头文件的包含;define的定义符号替换;删除注释 -----文本操作
2.编译:把c语言代码转换为汇编代码,语法分析;词法分析;符号汇总;语义分析
符号汇总:汇总全局符号(变量名和函数名都要)例如:main()函数
3.汇编:把汇编代码转换为机器语言,生成目标代码;并且形成符号表
形成符号表:不同的源文件所产生的全局符号会被加上一个地址并且打包成一个符号表,若有效则定义存在的地址,无效则定义不存在的地址
以上三步可统称为编译,它是将源文件通过编译器转化为目标文件
4.链接:合成段表;合并符号表,最后放到执行文件中去
合成符号表,将有效的符号合成(所以在链接时会判断函数是否有效)
3.预处理阶段
1.预定义符号
__FILE__:当前源文件的地址
__LINE__:执行代码的行号
__DATE__:当前日期
__TIME__:当前时间
__STDC__:编译器是否遵循ANSI C,是返回1
2.#define
1.#define定义的标识符
#define MAX 100意指定义的东西后面所有都代替掉,所以一般不加 " ; "
2.#define定义的宏
#define name( parament-list ) stuff
括号紧贴宏名,并且为了使得附和设计的优先级必须在设计宏时注意括号的添加注意:对于宏,不能出现递归;预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索
宏参数传入时,别带有副作用,会导致计算不可控
3.#undef
使得存在的宏定义失效
4.宏和函数对比
宏:参数无限制,所以可以将类型也传入宏体中,功能性广。但是,类型不限制可控性差
函数:不能传入类型,但是保证了参数的类型可控
宏:执行时只需要替换便可,所以操作时间短
函数:需要生成堆栈,读取,返回函数一系列操作花费时间
宏:不能递归
函数:可以递归
宏:不能调试
函数:可以调试
宏:适用于短的语句使用
函数:使用于长的语句使用