带参数的宏定义理解篇

前言:最近在看一位叫朱有鹏大神的视频,讲的甚好。应此,我的感悟也因此被激发,准备针对朱老师将的内容,结合自己的理解,写一个系列的笔记博客~~大家可以去www.zhulaoshi.org观看视频~~

 

  带参数的宏定义,可以起到类似函数的效果,虽然看起来比定义函数简洁,但简洁的背后藏有陷阱,

需要我们去注意。

带参数的宏定义的一般形式如下:   

#define 宏名(参数表) 宏体 

  单看“宏名(参数表)”这个部分就类似于一个“简写”的函数声明,之所以说是“简写”,

那是因为,函数声明时,不管是函数名,还是参数名,都会带上类型,如:void add(int a , int b)

{函数体};而用宏则是:#define add(a,b)  宏体  

  还需注意的是带参数的宏定义的参数表外面本来是有一个括号的,他的意义是表示这是这里是一个

参数表,仅此而已。

 

举一个简单的例子:

#define add(a,b) a + b//定义部分

c = add(a,b);//使用部分

使用形式非常类似函数,但是他其实只是简单的替换add(a,b)被替换成了a + b。

 

再来,举一个例子:

#define SQR(x) (x*x)//定义部分

b = 3;

a = SQR(b+2)//使用部分,猜测一下结果是多少?

 

  在这个宏中,参数表中只有一个参数x,这样给人的感觉就是x是一个整体,而且还被一个括号括起来了。

所以一看看去结果就是(3+2)*(3+2)结果是25.

但是,前面已经强调过了参数表外边的括号,仅仅表示这是这里是一个参数表而已。所以真正的替换结果

应该是3+2*3+2,所以编译后得到的结果是11.而不是我们期望的25(求平方的结果)。

那么应该如何得到我们期望的结果呢?

  #define SQR((x)) (x*x) 为了强调x是一个整体我在参数表中将x外在加上一层括号。但是很可以这种

语法是错误的参数表里只能是参数逗号和参数,不能有其他的东西。

所以,正确的写法应该是 #define SQR(x) ((x)*(x)) 这样才会被替换成 (3+2)*(3+2)结果是25.

但是,你说我就这么定义#define SQR(x) (x*x) 但是我使用的时候,这么写SQR((b+2)),这样写编译

通过,而且得到的结果是25.

 

总结:带参数的宏定义,虽然形式上简单,但是他其实还是简单的替换,所以在宏体中,能括起来的

尽量都括起来。

转载于:https://www.cnblogs.com/douzi2/p/4934126.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
定义中的section属性可以用来指定变量或函数所属的段(section)。引用中的定义示例说明了一个使用了section属性的定义。这个定义将一个变量定义在名为".sched.text"的段中。 在C语言中,使用section属性可以在编译器级别上控制变量或函数的存储位置。通过将变量或函数放置在特定的段中,可以实现对程序的优化或者实现特定的需求。 引用中的文章提供了更详细的解释。它解释了section属性的起因和用法,以及使用它可以实现的一些功能。这篇文章可以帮助你更深入地理解section属性的使用。 另外,引用中的定义示例展示了另一种使用section属性的定义。这个定义使用了regparm(3)属性,将一个函数定义为使用寄存器传递参数的函数,并指定该函数所属的段。 综上所述,定义中的section属性可以用来指定变量或函数所属的段,从而实现对程序的优化或者满足特定的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux内核常见定义](https://blog.csdn.net/weixin_33603111/article/details/116613203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言中的__attribute__定义之section属性](https://blog.csdn.net/qq_38824401/article/details/119717389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值