宏和函数的区别

来源:互联网 发布:知乎匿名提问怎么删除 编辑:程序博客网 时间:2024/06/07 03:38

//1.使用宏实现两个数中求较大值。

#include<stdio.h>#include<stdlib.h>#define MAX(x,y) ((x)>(y))?(x):(y)int main(){   printf("max=%d\n", MAX(1020));   system("pause");   return 0;}

那么宏和函数有什么区别呢?

1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已.

2.宏进行定义时不会考虑参数的类型.也就不够严谨。

3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小.

4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作.

5.参数宏在定义时要多加小心,多加括号.

6.函数只在目标文件中存在一处,比较节省程序空间.

7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢.

8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在.
9.宏不可以调试,函数可以调试。
10.宏的参数可以出现类型,但是函数做不到。
如:

#defineMALLOC(num, type)\         (type *)malloc(num * sizeof(type))         MALLOC(10, int);//类型作为参数//预处理器替换之后:(int*)malloc(10* sizeof(int));

例子:
下面这个宏定义会出错:

#include <stdio.h>#define SQUARE( x ) x * xint main(){  int a = 5;  printf("%d\n",SQUARE( a + 1) );  return 0;}

乍一看,你可能觉得这段代码将打印36这个值。
事实上,它将打印11.
为什么呢?
替换文本时,参数x被替换成a + 1,所以这条语句实际上变成了:
printf (“%d\n” ,a + 1 * a + 1 );
因此建议宏定义时加上括号。避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。

注意:
1 . 宏参数和#define 定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归。
2 . 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

#和##
#
把一个宏参数变成对应的字符串。

#define PRINT(FORMAT, VALUE)\        printf("the value of "#VALUE "is "FORMAT "\n", VALUE);        int main()        {         int a= 10;         PRINT("%d", a);//产生了什么效果?         return 0;         }代码中的 #VALUE 会预处理器处理为: "VALUE" . 最终的输的结果应该是:the value of a is 10

##的作用

##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
注意:
这样的连接必须产生一个合法的标识符。否则其结果就是未定义的。

以上