天天看点

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);
      

函数式宏中多条语句使用

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