带参数宏定义和函数的区别
2013-04-03 21:14
211 查看
#define S(a,b) a*b
area=S(3,2)
int S(int a,int b)
{ int s;
s=a*b;
return(s);
}
这两个有什么区别
#define S(a,b) a*b
area=S(3,2)
尽量少使用宏定义。宏定义是把S(a,b)简单地替换成a*b
这样会产生问题,最典型的两种:
1.缺括号,比如aera=S(x+y,x-y),会被替换成x+y*x-y
2.自增运算符
定义宏
#define S(a) (a)*(a)
结果S(a++),变成(a++)*(a++)这个大家都知道,在不同编译环境下会有不同结果。
也就是说,宏只是编译前简单替换代码内容,而函数真正产生代码。
宏是编译期的,函数是运行期的;
宏不是实体,而函数是一个可寻址的实体;
宏只是编译期替换,在程序里每遇到S(a,b),就用a*b代替,a和b两个实体并没有由宏实际产生,而函数S会在栈中定义两个对象a和b。
宏没有生存期、作用域之类的概念,而函数就有。
函数在运行过程中会在栈中产生函数调用过程活动记录,而宏则没有。
area=S(3,2)
int S(int a,int b)
{ int s;
s=a*b;
return(s);
}
这两个有什么区别
#define S(a,b) a*b
area=S(3,2)
尽量少使用宏定义。宏定义是把S(a,b)简单地替换成a*b
这样会产生问题,最典型的两种:
1.缺括号,比如aera=S(x+y,x-y),会被替换成x+y*x-y
2.自增运算符
定义宏
#define S(a) (a)*(a)
结果S(a++),变成(a++)*(a++)这个大家都知道,在不同编译环境下会有不同结果。
也就是说,宏只是编译前简单替换代码内容,而函数真正产生代码。
宏是编译期的,函数是运行期的;
宏不是实体,而函数是一个可寻址的实体;
宏只是编译期替换,在程序里每遇到S(a,b),就用a*b代替,a和b两个实体并没有由宏实际产生,而函数S会在栈中定义两个对象a和b。
宏没有生存期、作用域之类的概念,而函数就有。
函数在运行过程中会在栈中产生函数调用过程活动记录,而宏则没有。
相关文章推荐
- 带参数宏定义和函数的区别
- 带参数宏定义和函数的区别
- 深入剖析C函数参数的结合顺序及a++和++a的区别
- c++中内敛函数与宏定义的区别
- C语言陷阱:宏定义与函数的区别
- 请教Spark 中 combinebyKey 和 reduceByKey的传入函数参数的区别?
- Python函数小结(1)--参数类型(*, ** 的区别), 闭包
- C语言学习5:数组定义,数组名的含义,数组作为函数参数,数组赋值,数组左右移动,最大最小,反向遍历,冒泡排序,sizeof 和strlen区别,gets和puts,strcpy,strcat,strcmp,strchr,strstr,strlen
- 函数传递参数的三种方式,以及它们的区别
- 抛出异常与传参数及调用虚函数之间的区别与联系
- 比较函数式宏定义和普通函数的区别
- 函数参数为 "char* p" 与 "char*& p" 的区别
- python函数参数前面单星号(*)和双星号(**)的区别
- 老生常谈python函数参数的区别(必看篇)
- 函数参数修饰符out、ref及空白的区别
- 函数式宏定义与普通函数的区别
- C/C++函数参数,传值域传址的区别
- c++异常参数传递和普通函数参数传递的区别。
- 数组名作为函数参数和数组元素作为函数参数有什么不同?‘\0’和“\0”的区别?
- JS与PHP向函数传递可变参数的区别实例代码