总结:宏函数和自定义函数的区别

宏函数和自定义函数的区别?

自定义函数:

#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.:函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/81351959