宏函数和自定义函数的区别?
自定义函数:
#include<stdio.h>
int max(int a,int b)
{
return a > b ? a : b ;
}
int main()
{
printf("%d\n", max(1,2));
return 0;
}
宏函数:
#include<stdio.h>
#define MAX(x,y) (x > y) ? x : y
int main()
{
printf("%d\n", MAX(3,4));
return 0;
}
C程序由源程序变为可执行文件的三个阶段是:
预处理阶段,由预处理器对程序文本中的宏进行展开。
编译阶段,由编译器对经过预处理后的程序进行编译,并生成目标文件
链接阶段,则链接器对目标文件和用到的函数库文件进行链接,生成可执行文件。
因此,宏展开是在预处理阶段完成的。
当编译器在预处理的过程中进行宏替换时,一般进行如下三步:
1:调用宏时,首先对参数进行检查,看是否包含由#define定义的符号,如果是,首先被替换
2:替换后的文本随后被插入到程序中原来的位置,宏,参数名被它们的值替换
3:再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程
宏定义的主要事项:
1:宏不能递归
2:当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索
宏函数和自定义函数的区别:
1:宏做的是简单的字符串替换,宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;但因为省去了函数的调用,返回,释放,所以效率比自定义函数高。函数的参数需要传递,参数是有类型的。
2: 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参。
3.:宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
4: 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
5.:函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.