C语言 函数式宏的使用

未使用函数式宏:
#include <stdio.h>

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;
}
使用函数式宏:
#include <stdio.h>

#define diff(x, y) (x - y)  // 定义一个函数式宏
#define cut_off_rule() (puts("--------------------------------------------")) // 定义一个不带参数的函数式宏

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 和紧邻其后的 “(” 之间插入空格,进行如下宏定义

 #define diff (x, y) (x - y)

则 diff 就会被编译器当作对象式宏,即程序中的 diff 都会被代替为 (x , y) (x - y)。
所以在定义函数式宏时必须注意不要误将空格写入宏名称和 “(” 之间。

总结:

  • 函数定义需要为每个形参都定义各自的数据类型,返回值的类型也只能为一种。
  • 函数式宏适用各种数据类型,不需要每个形参都定义各自的数据类型,返回值的类型也可以为多种。
  • 函数
    • 参数传递(将实参的值复制到形参)
    • 函数调用和函数返回操作(程序流程的控制)
    • 返回值的传递
  • 函数式宏所做的工作只是宏展开和填入程序,不能做出函数的处理。
    例如 :
       #define diff(x, y) (x - y)
                         ↓
 展开后:
 diff(num1, num2) = (num1 - num2);

函数式宏中多条语句使用

函数式宏中 逗号运算符 a, b ,c 按顺序判断a , b,c .整个表达式最终生成 c 的判断结果

#include <stdio.h>

#define diff(x, y) (x - y)  // 定义一个函数式宏
#define cut_off_rule(str) (puts("----------------"), puts(str), puts("-----------------")) // 定义一个不带参数的函数式宏

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” 的类型和值。

猜你喜欢

转载自blog.csdn.net/qq_44989881/article/details/106889615