文章目录1 .程序的翻译和运转环境2.c言语程序的编译和链接3 .预界说符号介绍4 .预处理指令#define5.#和##的效果6 .宏与函数的比较7 .条件编译8 .文件包括
第一个是源代码被转换为可履行机器指令的翻译环境。 第二种是运转环境,用于实践运转代码。
2 .在编译c言语程序和整个链接的结构上,编译器别离编译每个源文件,终究构成一个方针文件。 后缀是. obj
然后,链接器将多个方针文件与所需的根据链接的文件链接起来构成可履行程序。 后缀为. exe
(1) .处理“#include 预编译指令”,将“#include 中包括的文件刺进该预编译指令的方位
源代码输入到扫描仪中。 扫描仪扫描时,会生成关键字、标识符、字面量、特殊符号等符号。 一起,扫描仪还履行其他使命,如在符号表中放置标识符,或将字面量放置在字符表中。
前面的语法分析器只查看了语法,但没有查看句子是否有意义,语义分析器查看了句子是否有意义
汇编阶段的意图是将程序集代码转换为二进制指令,即终究得到的方针文件。 后缀是. obj
方针文件以由多段组成的elf文件格局安排。 联接段表是对方针文件中同一段的联接
# definename (参数列表) stuff中的参数列表是由逗号分隔的符号表,或许会显现在stu中。 留意:参数列表的左括号有必要紧邻name。 假如两者之间有空白,则参数列表被解释为stu的一部分。
因而咱们在写宏的时分 , 记得要加上括号,不然或许会由于操作符优先级的问题导致没有正真取得咱们想要的成果
##能够把坐落它两头的符号组成一个符号。 它答应宏界说从别离的文本片段创立标识符。
#includestdio.h#define ADD_TO_SUM(num,value) sum##num += valueint main(){int sum5 = 10;ADD_TO_SUM(5, 10);printf(%d\n, sum5);}// 打印成果为 20 六.宏和函数的比照 特点#define界说宏函数代码长度每次运用时,宏代码都会入到程序中。除了十分小的宏之外,程序的长度会大幅度增加函数代码只呈现于一个当地;每次运用这个函数时,都调用那个当地的同一份代码执 行 速 度更快存在函数的调用和回来的额定开支, 所以相对慢一些操 作 符 优 先 级宏参数的求值是在所有周围表达式的上下文环境里,除非加 上括号,不然附近操作符的优先级或许会发生不行意料的成果,所以主张宏在书写的时分多些括号。函数参数只在函数调用的时分求值一 次,它的成果值传递给函数。表达式 的求值成果更简单猜测带 有 副 作 用 的 参 数参数或许被替换到宏体中的多个方位,所以带有副效果的参 数求值或许会发生不行意料的成果函数参数只在传参的时分求值一次, 成果更简单操控。参 数 类 型宏的参数与类型无关,只要对参数的操作是合法的,它就能够正常的运用于任何参数类型。函数的参数是与类型有关的,假如参数的类型不同,就需要不同的函数, 即便他们履行的使命是相同的调 试宏是不便利调试的函数是能够逐句子调试的递归宏是不能递归的函数是能够递归的七.条件编译
在编译一个程序的时分咱们假如要将一条句子(一组句子)编译或许抛弃是很便利的。因咱们有条件编译指令。
管理员
该内容暂无评论