未使用函数式宏:
int diff_int(int x, int y){
return x- y;
}
long diff_long(long x, long y){
return x- y;
}
int main(void){
int num1;
int num2;
puts("请输入减数:");
scanf("%d", &num1);
puts("请输入被减数:");
scanf("%d", &num2);
printf("%d - %d = %d\n", num1, num2, diff_int(num1, num2));
puts("--------------------------------------------");
long num3;
long num4;
puts("请输入减数:");
scanf("%ld", &num3);
puts("请输入被减数:");
scanf("%ld", &num4);
printf("%ld - %ld = %ld\n", num3, num4, diff_long(num3, num4));
return 0;
}
使用函数式宏:
// 定义一个函数式宏
// 定义一个不带参数的函数式宏
int main(void){
int num1;
int num2;
puts("请输入减数:");
scanf("%d", &num1);
puts("请输入被减数:");
scanf("%d", &num2);
printf("%d - %d = %d\n", num1, num2 , diff(num1, num2));
cut_off_rule();
long num3;
long num4;
puts("请输入减数:");
scanf("%ld", &num3);
puts("请输入被减数:");
scanf("%ld", &num4);
printf("%ld - %ld = %ld\n", num3, num4, diff(num3, num4));
return 0;
}
注:
如果在宏名称 diff 和紧邻其后的 “(” 之间插入空格,进行如下宏定义
则 diff 就会被编译器当作对象式宏,即程序中的 diff 都会被代替为 (x , y) (x - y)。
所以在定义函数式宏时必须注意不要误将空格写入宏名称和 “(” 之间。
总结:
- 函数定义需要为每个形参都定义各自的数据类型,返回值的类型也只能为一种。
- 函数式宏适用各种数据类型,不需要每个形参都定义各自的数据类型,返回值的类型也可以为多种。
- 函数
- 参数传递(将实参的值复制到形参)
- 函数调用和函数返回操作(程序流程的控制)
- 返回值的传递
- 函数式宏所做的工作只是宏展开和填入程序,不能做出函数的处理。
例如 :
↓
展开后:
diff(num1, num2) = (num1 - num2);
函数式宏中多条语句使用
函数式宏中 逗号运算符 a, b ,c 按顺序判断a , b,c .整个表达式最终生成 c 的判断结果
// 定义一个函数式宏
// 定义一个不带参数的函数式宏
int main(void){
int num1;
int num2;
puts("请输入减数:");
scanf("%d", &num1);
puts("请输入被减数:");
scanf("%d", &num2);
printf("%d - %d = %d\n", num1, num2 , diff(num1, num2));
if(diff(num1, num2) > 0){
cut_off_rule("最后结果大于0。");
}else if(diff(num1, num2) < 0){
cut_off_rule("最后结果小于0。");
}else{
cut_off_rule("最后结果等于0。");
}
return 0;
}
注:
- 如果宏定义中要代换两个以上的表达式,则使用逗号运算符连接,使其在语法上构成一个表达式。
- 一般由逗号运算符连接的多个表达式,“a, b, c,…” 在语法上可以视为一个表达式(只要是由运算符连接的多个表示,例如“a + b + c…”,都可以视为一个表达式)。
- 对于使用逗号运算符的逗号表达式“a, b”.会按顺序判断表达式a 和 b。对左侧的表示 a 仅进行判断,判断结果会被省去。而对右侧的表达式 b 进行判断所得到的类型和值,就是逗号表达式 “a, b” 的类型和值。