C语言的宏展开,讲一下什么是宏展开,怎么实现?

要求: 字符串替换(字符串里面的不能替换) 层层置换 带参数的宏替换 范围替换 ps:所谓c++宏展开,是不是就是对源代码的替换?用#define声明一下? 后面三个是什么意思,求解释一下题目意思,感激不尽

第1个回答  2019-07-28
对于C++宏展开,先说一点:
#define功能将源程序文件中出现的对宏的引用展开成相应的宏
定义,由预处理器来完成。经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作的确只是纯粹的替换与展开,没有任何计算功能。
对于“带参数的宏替换”,可以由下列代码尝试理解下
#include
<stdio.h>
#define
min(x,y)
({
typeof(x)
_x
=
(x);typeof(y)
_y
=
(y);
(void)
(&_x
==
&_y);
_x
<
_y
?
_x
:
_y;
})
//防止x和y为一个表达式和失去了类型检测功能;
#define
min_replace(x,y)
({
x
<
y
?
x
:
y;
})
void
main()
{
int
x=1;
int
y=2;
int
result
=
min(x++,y);
printf("没有替换时的运行结果为:%d\n",result);
int
x1=1;
int
y1=2;
int
result1
=
min_replace(x1++,y1);
printf("替换之后的运行结果为:%d\n",result1);
return
;
}
需要注意:
宏名和参数表的括号间不能有空格。
宏替换只做替换,不做计算和表达式求解,这一点要格外注意。
函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。
宏的哑实结合(哑实结合类似于函数调用过程中实参替代形参的过程)不存在类型,也没有类型转换。
宏展开使源程序变长,而函数调用则不会。
相似回答