一、不带参数的宏定义
1、格式:
#define 宏名 字符串
例:#define a 6
则a是宏名,凡是出现a的地方均用6替换
2、注意:
宏替换是一种机械替换;不做语法检查,不是下一个语句,其后不加";"
#define命令出现在函数的外面,有效范围是定义处到本源文件结束,可以用#undef命令终止作用域。
进行宏定义时可以用已经定义的宏名,进行层层叠换。
对程序中双引号括起来的字符串内,即使与宏名相同,也不进行置换。
#define a 3
int fun()
{
......
}
#undef a
int main()
{
......
}
二、带参数的宏定义
1、格式:
#define s(a,b) a*b
2、该宏替换也是机械替换
#define s(a,b) a*b
int a=1;int b=2;
data=s(a+b,a+b);
data的值并不等于9而是1+2*1+2=5
3、实际例子:
1、定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。
输出已交换后的两个值。
#include <iostream>
using namespace std;
#define change(a,b) int t=a; a=b; b=t
int main()
{
int n, m;
cin >> n >> m;
change(n, m);
cout << n << '\t' << m;
}
运行结果:
![](https://img-blog.csdnimg.cn/3bc7c442773b4770bc2c59d89a74f0e1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3dlZXRDaW5kZXJlbGxh,size_20,color_FFFFFF,t_70,g_se,x_16)
2、输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
#include <iostream>
using namespace std;
#define remainder(a,b) a%b
int main()
{
int n, m;
cin >> n >> m;
int t=remainder(n, m);
cout << t << '\n';
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/c57fda2c756743399d349926193882d1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3dlZXRDaW5kZXJlbGxh,size_20,color_FFFFFF,t_70,g_se,x_16)
3、三角形面积 = SQRT(S * (S - a) * (S - b) * (S - c)) 其中S = (a + b + c) / 2,a、b、c为三角形的三边。定义两个带参的宏,一个用来求area,另一个宏用来求S,写程序,在程序中用带实参的宏名来求面积area(保留三位小数)
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
#define fun1(a,b,c) (a+b+c)/2
#define fun2(s) sqrt(s * (s - a) * (s - b) * (s - c))
int main()
{
float a, b, c;
cin >> a >> b>>c;
float s = fun1(a, b, c);
float area = fun2(s);
cout << fixed << setprecision(3) << area << '\n';
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/a69f66cbefe34101a40d6baf72e06d6b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3dlZXRDaW5kZXJlbGxh,size_20,color_FFFFFF,t_70,g_se,x_16)