用#define宏实现Add函数

简介: 用#define宏实现Add函数

我们知道#define宏是一种非常暴力的替换宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换,因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。  


首先亮出答案:

#define Add(x,y) ((x)+(y))


那这里可能会有两个疑惑? 1.为什么x和y参数单独要加上括号? 2. 为什么x+y整体要加上括号?

这里是为了解决两个可能出现的问题:1.表达式问题(大括号) 2.优先级问题(小括号)

表达式冲突:

#define ADD(x,y) x+y
int main()
{
  int x = 2;
  int y = 3;
  printf("%d\n", ADD(x,y)*3 ); //宏替换为2+3*3
}


结果:


62eeca6d7f63444e88a160e4cc06cf9a.png


分析:我们想得到的结果应该是(2+3)*3 =15,但为什么是11呢?这里是因为宏的直接替换导致表达式为 2+3*3 =11;所以为了解决此问题我们加上大括号

优先级问题:

#define ADD(x,y)  (x + y)
int main()
{
  int a = 2;
  int b = 3;
  printf("%d\n", ADD(a|b, a&b)); //宏替换为  2|3 + 2&3;算术运算符比逻辑运算符优先级高
}


结果


3937f9a377bf4b89ad35648549869b7f.png


分析:考虑到参数可能作为表达式中的一份子,而运算符具有优先级区别,这里"+" 算术运算符比逻辑运算符"|,&"优先级更高,宏直接替换为 2|3 + 2&3  =3;所以我们为每个参数加上括号解决优先级问题


宏函数的优缺点:


优点:直接暴力替换,不是函数不需要建立函数栈帧,提高程序运行效率


          可复用性


缺点:宏函数预处理阶段被替换,不会进行类型的检测,代码安全性低


          宏函数不能进行调试  


          容易出错,宏函数的每一部分都需要加上括号      


宏函数能否加分号?不可以,(如果是表达式中不小心多加了分号可以,支持两个分号同时出现 )


内联函数:填补了宏函数的缺点,继承了其优点(但是实现方式还是以空间换时间的做法)

相关文章
|
5月前
|
小程序
小程序 define is not defined
小程序 define is not defined
49 0
|
6天前
#define定义常量和宏
#define定义常量和宏
14 0
|
6天前
|
Linux
offsetof宏与container_of宏
offsetof宏与container_of宏
14 0
|
6天前
宏#define命令练习3
宏#define命令练习3
21 1
|
8月前
#define的用法
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。 1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先 被替换。 2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
52 0
|
6天前
宏#define命令练习2
宏#define命令练习2。
20 1
|
6天前
宏#define命令练习
宏#define命令练习。
20 2
|
8月前
|
编译器
#define 定义常量和宏
工作机理:直接替换,以下列代码为例编译器直接将用到max的地方替换为100
39 0
|
编译器
宏定义(#define)及相关知识
宏定义(#define)及相关知识
85 0
|
C语言
宏定义#define的使用
宏定义#define的使用
82 0