关于预处理、宏和函数、编译链接的理解
2016-10-19 04:13
405 查看
1.预处理标识符
__FILE__ //当前编译的源文件
__LINE__ //文件当前所属行号
__DATE__ //文件被编译日期
__TIME__ //文件被编译时间
# //将其后的宏参数进行字符串化操作,简单讲就是在它引用的宏变量左右各加上一个双引号
## //将其两边符合连接成一个符号
eg:#define CAT(STR1,STR2)\
STR1##STR2
printf("%d\n",CAT(aa,bb));
2.宏和函数的区别
宏是类型无关,可以频繁的用于执行简单的计算。函数不行。
eg: #define MALLOC(n,type) \
((type *)malloc((n)*sizeof(type)))
int *pi=MALLOC(25,int);
//int *pi=((int*)malloc((25)*sizeof(int)));
区别:(1)每使用一次,宏代码就插入到程序中一次,代码长度将增加;函数中代码只出现在一个地方,使用时,调用即可。
(2)宏的执行速度更快;函数存在函数调用/返回的额外开销。
(3)宏中邻近的操作符优先级会产生不可预料的结果。加do{}while(0);函数表达式求值结果更容易预测。
(4)参数每次用于宏定义时,都将重新进行求值,参数的副作用会带来不可预料的结果。函数参数则只在被调用时求一次值。
(5)宏与类型无关,函数的参数是与类型有关的。
3.编译链接的整个过程及每个过程
1.源文件(.c/.cpp)
2.预处理(.i):完成宏替换、头文件展开、去注释、条件编译。
3.编译(.s):生成汇编代码。
4.汇编(.o):将汇编指令转换为二进制。
5.链接:生成可执行程序。
__FILE__ //当前编译的源文件
__LINE__ //文件当前所属行号
__DATE__ //文件被编译日期
__TIME__ //文件被编译时间
# //将其后的宏参数进行字符串化操作,简单讲就是在它引用的宏变量左右各加上一个双引号
## //将其两边符合连接成一个符号
eg:#define CAT(STR1,STR2)\
STR1##STR2
printf("%d\n",CAT(aa,bb));
2.宏和函数的区别
宏是类型无关,可以频繁的用于执行简单的计算。函数不行。
eg: #define MALLOC(n,type) \
((type *)malloc((n)*sizeof(type)))
int *pi=MALLOC(25,int);
//int *pi=((int*)malloc((25)*sizeof(int)));
区别:(1)每使用一次,宏代码就插入到程序中一次,代码长度将增加;函数中代码只出现在一个地方,使用时,调用即可。
(2)宏的执行速度更快;函数存在函数调用/返回的额外开销。
(3)宏中邻近的操作符优先级会产生不可预料的结果。加do{}while(0);函数表达式求值结果更容易预测。
(4)参数每次用于宏定义时,都将重新进行求值,参数的副作用会带来不可预料的结果。函数参数则只在被调用时求一次值。
(5)宏与类型无关,函数的参数是与类型有关的。
3.编译链接的整个过程及每个过程
1.源文件(.c/.cpp)
2.预处理(.i):完成宏替换、头文件展开、去注释、条件编译。
3.编译(.s):生成汇编代码。
4.汇编(.o):将汇编指令转换为二进制。
5.链接:生成可执行程序。
相关文章推荐
- C语言 宏和函数 个人对编译链接的理解
- 函数执行过程(预处理->编译->汇编->链接)
- 关于编译与链接具体内容及头文件与源文件区别的理解
- 预处理标识符,预处理与函数的相关的区别;程序的编译与链接的过程
- 关于函数模版编译出现链接错误
- 预处理 宏与函数区分 Linux 预处理 编译 汇编 链接 简析
- 关于gcc编译流程四个步骤的具体分析,预处理、编译、汇编、链接
- 预处理标识符,宏和函数区别,编译连接过程。
- 理解程序编译预处理与链接过程
- 小记:关于Visual Studio编译链接出现控制台闪退的解决办法
- 预处理,编译,链接过程
- GCC 预处理、编译、汇编、链接..
- 关于crypt函数编译的问题
- 作业疑点:关于Linux下数学函数math.h无法编译问题
- 关于函数strtok和strtok_r的理解
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- mysqli预处理编译的深入理解
- 关于函数指针的理解(指向的函数返回值又是另外一个函数指针)
- 关于IAR编译器在编译链接的时候一些知识的收集
- 第三次讲座盲点整理(编译与链接)——入口函数一定是main?