宏函数和函数的区别及其优缺点
2017-08-11 10:17
197 查看
宏定义,编译预处理指令,在编译预处理时即进行简单的字符替换,也只进行简单的字符替换。而宏定义的函数和用户定义的函数在使用时有什么区别?如下:
1.宏函数会在编译预处理时展开,只占编译时间,函数调用则会占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏会较慢。
2.在函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。
3.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
4.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。
5.宏函数的定义也有其缺点,它很容易会产生二义性,具体如下:
----------------------------------下在这边↓-------------------------------------
我们程序的原意是求(2+2)*(3+3),结果为24,用函数执行得到了正确的结果。
而如果用宏函数进行运算:
宏函数只进行了简单的字符替换,它将程序错误的展开成了2+2*3+3=11,因为运算顺序的原因得到了错误的结果。
1.宏函数会在编译预处理时展开,只占编译时间,函数调用则会占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏会较慢。
2.在函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。
3.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
4.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。
5.宏函数的定义也有其缺点,它很容易会产生二义性,具体如下:
----------------------------------下在这边↓-------------------------------------
我们程序的原意是求(2+2)*(3+3),结果为24,用函数执行得到了正确的结果。
而如果用宏函数进行运算:
宏函数只进行了简单的字符替换,它将程序错误的展开成了2+2*3+3=11,因为运算顺序的原因得到了错误的结果。
相关文章推荐
- MySQL存储过程和函数的区别与优缺点
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
- 百度面试题:宏的概念,与函数的区别,优缺点的比较。
- strcpy函数与memcpy函数的区别及其函数实现
- ArrayList、Vector、LinkedList的区别及其优缺点?
- 关于数据库存储过程和函数的区别,优缺点以及各家之言
- 激活函数的区别优缺点对比
- MFC全局函数AfxBeginThread 及其与CreateThread的区别
- MySQL存储过程和函数的区别与优缺点
- 百度面试题:宏的概念,与函数的区别,优缺点的比较
- ArrayList、Vector、LinkedList的区别及其优缺点?
- NGUI与UGUI的区别及其优缺点
- 链表面试题(1)----顺序表和链表的区别及其优缺点
- 数据库存储过程及其与函数区别
- 宏函数和函数的区别及优缺点
- ArrayList、Vector、LinkedList的区别及其优缺点?
- ArrayList,LinkedList,Vector区别及其优缺点
- ArrayList,LinkedList,Vestor区别及其优缺点
- 【分析函数】使用分析函数LAST_VALUE或11g LAG实现缺失数据填充及其区别
- ArrayList,LinkedList,Vestor区别及其优缺点