宏和函数的区别
来源:互联网 发布:单片机脉冲理疗仪原理 编辑:程序博客网 时间:2024/05/16 14:34
1.宏
宏定义又称宏代替,宏替换,其声明方式为:#define name(parameter-list) stuff。其中,parameter-list(参数列表)是一个有逗号分隔的符号列表,它们可能出现在stuff中。必须注意的是,参数列表的左括号必须与name紧密相连,如果两者之间有任何空格存在,则参数列表会被解释为stuff的一部分。#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。此外,还要注意,在使用宏的时候,一定不不要吝啬“()”,否则,宏替换不会根据你所期待的那样替换,如下所示。
#include<stdio.h>#include<stdlib.h>#define MUL(x) x*xint main(){ printf("%d\n", MUL(5 + 2)); //这里也许我们期待的是7*7,打印值49,然而,结果却是17,因为MUL(5+2)被替换为:5+2*5+2 //所以我们最好这样定义宏:#define MUL(x) (x)*(x),但是,这样依然有问题,如打印如下值 printf("%d\n", 3 * MUL(5 + 2)); //这里也许我们期待的是3*7*7,打印值147,然而,结果是27,因为3*MUL(5+2)被替换为:3*5+2*5+2 //所以,在上面的基础上,我们继续加上外层括号,将宏定义写为:#define MUL(x) ((x)*(x)) system("pause"); return 0;}
2. 函数
函数的定义就是函数体的实现。函数体就是一个代码块,他在函数被调用的时候执行。函数定义的语法如下:
类型
函数名(形参)
代码块
对函数的调用规定为“单向值传递”,即只能将实参的值传递给形参,不能奢求形参值的改变从而使实参的值随之改变,因为形参只是实参的一份临时拷贝,函数调用结束后,函数代码块这片内存随之消失。同时,必须牢记不能返回栈指针。如下,例1,实现两个数的交换,例2,实现字符串拷贝。
//例1,实现两个数的交换,错误的函数用法#include<stdio.h>#include<stdlib.h>void Change(int a, int b){ int tmp = 0; tmp = a; a = b; b = tmp; printf("函数代码块中:a=%d,b=%d\n",a,b);}int main(){ int a = 2; int b = 5; Change(a, b); printf("调用结束后:a=%d,b=%d\n",a,b); system("pause"); return 0;}
//例2,实现字符串拷贝,函数的错误用法,企图返回栈指针#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>char * CreateMemory(int n){ char *ret = NULL; ret = (char *)malloc(n*sizeof(char)); return &ret;}int main(){ char *ret = NULL; ret=CreateMemory(10); strcpy(ret, "hello"); printf("%s\n", ret); free(ret); system("pause"); return 0;}
3.宏和函数区别
1.宏只占编译时间,函数调用则占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏会较慢。
2.使用宏次数多时,宏展开后源程序很长,因为每展开一次都使程序增长,但是执行起来比较快一点(这也不是绝对的,当有很多宏展开,目标文件很大,执行的时候运行时系统换页频繁,效率就会低下)。而函数调用不使源程序变长。
3.宏定义很容易产生二意性,比如上述的例子。
4.函数的参数必须申明为一种特定的类型,所以它只能在类型合适的表达式上使用。然而,比如比较两个数的大小并返回较大,可以这样定义:#define MAX(a,b) ((a)>(b)?(a):(b)) ,这个宏以用于任何可以用<、>操作符比较大小的类型。换句话说,宏是与类型无关的。
5:调用函数只可得到一个返回值,且有返回类型,而宏没有返回值和返回类型,但是用宏可以设法得到几个结果。
6:函数体内有Bug,可以在函数体内打断点调试。如果宏体内有Bug,那么在执行的时候是不能对宏调试的,即不能深入到宏内部。
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 宏和函数的区别
- 161017
- 【studio】Android Studio中删除所有的断点
- android: resumeWhilePausing属性
- Struts2 文件下载
- 成功的背后!(送给所有IT人)
- 宏和函数的区别
- 在总线时序协议中,时序主要用于描述什么出现在总线上的定位方式?
- poj 1011 Sticks(经典深搜dfs+剪枝)
- WebApplicationContext初始化
- 重写equals应该注意的一个细节
- Python爬虫利器之PhantomJS的用法
- IO流
- 坚持#第69天~让优秀成为一种习惯
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。