使用#define指令和#undef指令进行宏定义和终止宏定义

使用#define指令进行宏定义

       宏定义的功能是用一个标识符来表示字符串,标识符称为宏名。在预编译处理时,对程序中出现的宏名,在程序中出现的宏名,都用宏定义中出现的字符串去代替。
       #define 指令的形式是: #define 宏名 宏定义内容
       凡是在程序中遇到“宏名”预编译处理程序就用这个“宏定义内容”原封不动的替换宏名,进行编译。C语言中宏定义可分为无参宏定义和有参宏定义两种。
Ⅰ )无参宏定义
       无参宏定义的一般形式为:#define 宏名 宏定义内容
例如:#define PI 3.14159

       表示将PI定义为3.14159。在程序中,凡是遇到宏名PI ,都使用数值 3.14159原封不动的替换PI 进行编译。

       需要注意的是:用引号括起来的宏名,预处理程序不对其进行宏替换。例如:

#include<stdio.h>

#define Tom cat

int main()
{
    printf("Tom");
    printf("\n");
    return 0;
}

       程序运行时不会使用cat 去替换宏名Tom,编译器会将双引号中的Tom当作字符串处理,输出Tom。而如果在宏定义内容中出现引号,在编译时任然会原封不动的进行替换。例如:

#include<stdio.h>

#define Tom "cat"

int main()
{
    printf("%s",Tom);
    printf("\n");
    return 0;
}

       程序执行时遇到宏名Tom则会用宏定义内容“cat”进行替换输出cat 。

Ⅱ)有参宏定义
       宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏定义,在定义时不仅要宏展开,而且要用实参来代替形参。代参宏定义的一般形式为:
       #define 宏名(形参表) 宏定义内容
       代参宏调用的一般形式为:宏名(实参表);

例如:#define L(x) (x*x+2*x+x)
       宏调用: y = L(5);在宏调用时,用实参5 去代替形参x,经预处理宏展开后的语句是:y =(5*5 + 2*5 +5) ;

       使用宏定义时要注意以下几点;
(1)通常宏名都用大写字母表示,以便与程序中的变量相区别。从语法上来讲,不管是大写或小写,只要是合法的标识符都可以。
(2)通常将宏定义放在源程序文件开头。
(3)在宏展开时,只是原封不动的用宏定义内容替换宏名,别的什么计算、语法,编译预处理都不管。
(4)当宏名出现在字符串中时,预编译处理不对宏名进行宏展开,而是当作字符串处理。

使用#undef 终止宏定义####

       #undef指令又叫终止宏指令,若要终止宏的作用域,可使用终止宏指令。#undef指令的一般形式是:
       #undef 宏名
例如:

#define PI 3.14159
        .
        .
        .
#undef PI

       #undef PI终止了PI 的作用域。若没有设置终止宏指令,则宏名的作用域是从宏定义开始到源文件结束为止。

       下面看一个简单的例子:

#include<iostream>
using namespace std;

#define PI 3.14159 //宏定义
#define AREA "圆面积为:"

int main()
{
    float area1, area2;
    int radius;
    cout << "请输入圆半径: ";
    cin >> radius;
    area1 = PI *radius*radius;
    #undef PI //终止宏定义
    float pi = 3.14;
    area2 = pi*radius*radius;
    cout << AREA <<"area1="<< area1 << endl << AREA <<"area2="<< area2 << endl;
    return 0;
}

运行结果:

       在程序源文件开头进行宏定义:#define PI 3.14159在程序计算面积area1 后,终止了PI的宏定义。从新定义了float型变量PI,计算area2时使用了相同的变量名PI,程序运行结果并不相同,这是因为计算area1是使用的变量PI的值为宏定义的值3.14159,而计算area2时使用的是后来定义的float型变量值为3.14。这个例子可以帮我们简单理解宏定义和终止宏定义。

    原文作者:LiuBo_01
    原文地址: https://blog.csdn.net/LiuBo_01/article/details/78669757
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞