问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言宏定义函数如何调用?

发布网友 发布时间:2022-05-01 05:56

我来回答

4个回答

热心网友 时间:2022-06-25 06:50

  直接调用即可。如下示例:
#include<stdio.h>#define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d);}int main(){ int x=0,y=0; scanf("%d%d",&x,&y); sum (x,y); return 0;}  使用宏函数或者宏函数时,注意如下几点:
  (1)宏函数的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。
  (2)宏函数定义要注意格式,尤其是括号。
  如果上面的宏函数写成 #define MAX(a, b) (a>b?a:b),省去内层括号,则宏展开就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)>(b)?(a):(b),运算优先级也是错了。
  (3)宏函数往往会导致较低的代码执行效率。
 int a[]={9,3,5,2,1,0,8,7,6,4};  int max(n)  {  return n==0?a[0]:MAX(a[n],max(n-1));  }  int main()  {  max(9);  return 0;  }    若是普通函数,则通过递归,可取的最大值,时间复杂度为O(n)。但若是宏函数,则宏展开为( a[n]>max(n-1)?a[n]:max(n-1) ),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高。

热心网友 时间:2022-06-25 06:51

在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。
  我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义:
  #define MAX( a, b) ( (a) > (b) (a) : (b) )
  其次,把它用函数来实现:
  int max( int a, int b)
  {
  return (a > b a : b)
  }
  很显然,我们不会选择用函数来完成这个任务,原因有两个:首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销不仅会降低代码效率,而且代码量也会大大增加,而使用宏定义则在代码规模和速度方面都比函数更胜一筹;其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。
  和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝都会插入到程序中。除非宏非常短,否则使用宏会大幅度增加程序的长度。
  还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。
  看下面的例子:
  #define MALLOC(n, type) \
  ( (type *) malloc((n)* sizeof(type)))
  利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程:
  int *ptr;
  ptr = MALLOC ( 5, int );
  将这宏展开以后的结果:
  ptr = (int *) malloc ( (5) * sizeof(int) );
  这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实现为一个函数。
  下面总结和宏和函数的不同之处,以供大家写代码时使用,这段总结摘自《C和指针》一书。

example:
define的单行定义
#define maxi(a,b) (a>;b?a:b)
define的多行定义

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define MACRO(arg1, arg2) do { \
\
stmt1; \
stmt2; \
\
} while(0)
关键是要在每一个换行的时候加上一个 "\ "

//宏定义写出swap(x,y)交换函数
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;

zigbee里多行define有如下例子

#define FillAndSendTxOptions( TRANSSEQ, ADDR, ID, LEN, TxO ) { \
afStatus_t stat; \
ZDP_TxOptions = (TxO); \
stat = fillAndSend( (TRANSSEQ), (ADDR), (ID), (LEN) ); \
ZDP_TxOptions = AF_TX_OPTIONS_NONE; \
return stat; \
}

热心网友 时间:2022-06-25 06:51

宏定义,不能当函数使(函数中的return是返回到调用点,而宏中的return却是从调用点跑开了)
你的代码,在编译时会进行宏替换,真正的代码变成了如下:
#include<stdio.h>//#define a(b,c){int d=0;d=b+c;return d;printf("%d",d);}int main(){ int e=0,f=0; scanf("%d%d",&e,&f); //a(e,f); {int d=0;d=e+f;return d;printf("%d",d);} //本身这句也有问题,return后跟的printf()永远不会执行! return 0;}

热心网友 时间:2022-06-25 06:52

可以啊,
不过#define a(b,c){int d=0;d=b+c;return d;printf("%d",d);}其中的return d;最好去掉,因为宏是直接贴到用调用处的,相当于
int main(){ int e=0,f=0; scanf("%d%d",&e,&f); int d=0; d=b+c; return d; printf("%d",d); return 0;}还没printf就return了,打印不出来了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 360安全扫描 使用360安全卫士快速扫描时可以自己定义扫描内容吗? 简述网络安全扫描的内容及大致步骤. 什么是pki?2.简述网络安全扫描的内容 请问发转租在哪个软件上发好一点? 远程安全扫描评估可以提供以下什么扫描 六年级应用题(带解答) DNF植树节称号怎么得 植树节称号获得方法 qq三国植树节任务怎么玩 编写一段与鸟儿的对话(黄莺、百灵等小鸟) 2.仿写句子(至少4组对话) When is........? It is in....... ...植树节”为主题的 英文 广播稿 最好要男女对话型,本人高一,播音... 发挥你的想象,编写一段你与画眉(或黄莺、百灵等小鸟)的有趣的对话 植树节的班队活动,要求:有对话,有让同学回答的提问哦!急急急急急急急~~~~~~~~~下个星期四,快快,谢了 求关于世界上节日的英语对话一篇 一个多月了到现在都没来例假,验孕棒多久能测出怀孕? 植树节和父母对话为主的作文 验孕试纸一般在怀孕后多久,就可以可以检测到怀孕了,准确率有多高? 关于植树节英语三人对白 植树节的意义和准备的对话 什么是pki?2,简述网络安全扫描的内容 手机发送文件安全扫描 c语言宏定义函数如何调用(里面含参数可以当函数用吗) 请问一下,c语言中若用define简单宏定义一个函数,如下,#define power(x) x*x,为何不用指出x的类型? C语言里面“#define PUBLIC”后,然后定义函数PUBLIC BOOLEAN fun(),请问宏定义有什么作用? C语言#define定义函数优先级怎么算的? 考法律硕士用到的书本有哪些,请详细列举,谢谢?(本科非法学专业)_百度... 关于C语言宏函数的定义问题,恳请高手指点!! 研究生考试需要准备哪些书 考会计硕士需要买那些参考书? 法律硕士考研用书都有哪些? 计算机专业的能干什么工作? 法律硕士考试用书? 想考法律硕士,有没有推荐推荐书目呢? 法律硕士研究生考试依据考书有哪些 艺术硕士考试参考书有哪些 考法律硕士专业学位,需要看哪些教材? 教育学硕士考试科目及参考书 怎样去掉图片底色 ps如何去除图片底色