【C】高级宏定义

宏定义的实质

  • 宏定义实质:只替换,不计算。

C语言三大预处理功能

  • 宏定义
  • 文件包含
  • 条件编译

不带参数的宏定义

宏定义分为带参数和不带参数两种情况,不带参数的情况就是我们熟悉的直接替换操作。

例如:

#define PI 3.14

这个宏定义的作用是把程序中出现的 PI 在预处理阶段全部替换成 3.14。

注意

  • 为了和普通的变量进行区分,宏的名字通常我们约定是全部由大写字母组成

  • 宏定义只是简单地进行替换,并且由于预处理是在编译之前进行,而编译工作的任务之一就是语法检查,所以编译器不会对宏定义进行语法检查

  • 宏定义不是说明或语句,在末尾不必加分号

  • 宏定义的作用域是从定义的位置开始到整个程序结束

  • 可以用#undef来终止宏定义的作用域

  • 宏定义允许被嵌套

    #include<stdio.h>
    #define PI 3.14
    #define R  6371
    #define V  PI * R * R * R * 4 / 3
    int main(void)
    {
        printf("地球的体积大概是 : %.2f\n",V); 
        return 0;
    }
    

    运行结果

    地球的体积大概是 : 1082657777102.05
    

带参数的宏定义

C 语言允许宏定义带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。

例如:

#define MAX(x, y) (((x) > (y)) ? (x) : (y))

这个宏定义的作用是求出 x 和 y 两个参数中比较大的那一个

#include<stdio.h>
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
int main(void)
{
    int x, y;
    printf("请输入两个整数(用空格隔开) : ");
    scanf("%d%d",&x,&y);
    printf("%d 是较大的那个数! \n",MAX(x,y));
    return 0;
}

运行结果

请输入两个整数 : 3 5
5 是较大的那个数! 

注意

  • 使用带参数的宏定义时要注意空格问题,宏名和参数之间不能有空格,像下面这种语法是错误的

    #define MAX (x, y) (((x) > (y)) ? (x) : (y))
    
  • 因为宏定义本身进行的是机械替换,所以带参数的宏定义还需要注意括号问题

    #include<stdio.h>
    #define SQUARE(x)  x*x
    int main(void)
    {
        int x;
        printf("请输入一个整数 : ");
        scanf("%d",&x);
        printf("%d 的平方是 : %d\n",x, SQUARE(x));
        printf("%d 的平方是 : %d\n",x+1, SQUARE(x+1));
        //SQUARE(x+1) =>  x+1*x+1 => 5+1*5+1
        return 0;
    }
    

    运行结果

    请输入一个整数 : 5
    5 的平方是 : 25
    6 的平方是 : 11
    
posted @ 2025-02-14 21:25  芝麻凛  阅读(152)  评论(0)    收藏  举报