位置:首页 > 软件操作教程 > 编程开发 > C语言 > 问题详情

C语言 无参宏的定义与使用

提问人:刘团圆发布时间:2020-12-01

无参宏就是用一个标识符代表一个字符串,程序中使用到无参宏的地方,预处理时会直接用该字符串替换无参宏。

对于宏的操作包括:宏定义、宏调用以及宏展开。

1.无参宏的定义形式

    #define标识符字符串

例如:

    #define PI 3.14159

说明:

①“#”表示这是一条预处理命令,“define”是宏定义命令,“标识符”是所定义的宏名,“字符串”可以是一个任意类型的常数、表达式、格式串等。

②宏名一般建议使用大写字母表示,以和普通变量区分开。

2.宏调用

在程序中当需要使用一个字符串时,用宏名表示。

例如,一个求圆面积和周长的程序如下:

#include <stdio.h>

#define PI 3.14159   /* 此处为宏定义 */

main()

{

    int r=3;

    float s,c;

    printf("input radius:\n"); 

    scanf ("%d",&r);

    s=PI*r*r;          /* 宏定义 */

    c=2*PI*r;             /* 宏定义 */

    printf("s=%f ,c=%f\n",s,c);

}

程序中,无参宏PI-•旦定义,就可以在程序中用到 “3.14159” 的地方用PI来表示。

3.宏展开

编译预处理时用宏代表的字符串替换宏名的过程,称为宏展开,例如上述程序,宏展开后就成为:

main()

{

    int r=3;

    float s,c;

    printf("input radius:\n");

    scanf("%d",&r);

    s=3.14159*r*r;

    c=2*3.14159*r;

    printf("s=%f,c=%f\n",s,c);

}

4.关于无参宏的使用说明

①宏定义不是C语言语句,不能在行尾加分号“;”,否则,宏展开时,会将分号作为字符串的一部分一起展开替换宏名。例如:

    #define PI 3.14159;

展开时就会成为如下形式:

    s=3.14159;*r*r;

②宏定义命令#define出现在函数的外部,宏名的有效范围是:从定义命令之后到本文件结束。通常,宏定义命令放在文件开头处。在程序中可以使用#undef命令终止宏定义的作用域,例如:

#include <stdio.h>

#define N 100

#define PI 3.14

main

{

  …

}

#undef N

void fun()

{

  …

}

    由于#undef的作用,使宏f\ffimain()函数结束时就终止,所以fun()函数出现N也不代表100,但PI的作用域从开始定义一直到文件结束。使用#undef可以灵活地控制宏的作用范围。

③预处理器在用字符串替换程序中出现的宏时,只是简单地替换,并不做语法检查。例如,假设设计者手误,将3.14159写成了3.f4159:

    #define PI 3.f4159

程序在编译时会出现“操作数无效”的错误。

5.无参宏的应用

无参宏在实际中可以应用到很多方面,主要有以下几个方面:

(1)符号常量

如前面用到的PI、N都是符号常量的形式。

恰当命名的符号常量能表达出宏所代表的字符串常量的实际含义,从而增强程序的可读性。例如:

    #deflne EOF -1 /* 文件尾 */

    #define NULL 0 /* 空指针 */

(2)用宏定义表示数据类型

用宏定义表示一个数据类型,在程序中使用宏来定义数据,非常方便且直观,例如:

    #deflne SINGLE float

程序中,就可以使用SINGLE定义单精度变量,如:

    SINGLE x, y:

(3)用宏定义表示输入和输出

例如:

#deflne PI 3.14

#define S PI*r*r

朴 define OUT printf("%f ",S)

#deflne IN scanf("%d",&r) 

main ()

{

    int r;

    IN;

    OUT;

}

IN代表输入函数scanf(),OUT代表输出函数printf()。

(4)用宏定义表示输出格式

上题所用的丨N和OUT不具备通用性,如果将程序稍作改变:

#define PI 3.14 

#deflne S PI*r*r 

#deflne F "%f"

#deflne D "%d" 

#define OUT printf 

#define IN scanf 

main()

{

    int r=3;

    IN(D,&r);

    OUT(F,S):

}

程序中用宏F代表格式字符"%f",用宏D代表格式字符"%d",这样凡是在程序中需要用到这两个格式字符的地方全部可以用F、D代替。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部