快捷搜索:

C言语中define的用法

预处理命令以“#”号最初 ,如包括 命令#include,宏定义 命令#define等。一般都放在源文件的前面,它们称为预处理部分。

所谓预处理是指在进行编译之前所作的工作。预处理是C言语 的一个重要功用 ,它由预处理程序负责完成。当对一个源文件进行编译时,体系 将主动 引用预处理程序对源程序中的预处理部分作处理,处理完毕主动 进入对源程序的编译。

宏的定义

在C或C++言语 源程序中允许用一个标识符来表明 一个字符串,称为“宏”。被定义 为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有呈现 的“宏名”,都用宏定义 中的字符串去代换,这称为“宏代换”或“宏打开 ”。宏定义 是由源程序中的宏定义 命令完成的。宏代换是由预处理程序主动 完成的。

在C或C++言语 中,“宏”分为有参数和无参数两种。

无参数宏定义

无参数宏就是不带参数,其定义 的一般形式为:

  #define 标识符 字符串

  “标识符”为所定义 的宏名。“字符串”可所以 常数、表达式、格局 串等。

  例如:

  #define PI 3.14

它的作用是指定标识符PI来代替 常数3.14。在编写源程序时,所有用到3.14的当地 都可用PI代替 ,而对源程序作编译时,将先由预处理程序进行宏代换,即用3.14去置换所有的宏名PI,然后再进行编译。

宏定义 是用宏名来表明 一个字符串,在宏打开 时又以该字符串取代宏名,这只是一种简略 的代换,字符串可所以 常数,也可所以 表达式,预处理程序对它不作任何查看 。如有过错 ,只能在编译已被宏打开 后的源程序时发现。

宏定义 不是说明或语句(它是预处理指令),内行 末没必要 加分号,如加上分号则连分号也一同 置换。

下面举一个无参数宏代替 常数的例子:

#define PI 3.14
#include <stdio.h>

int main()
{
float r = 1.0;
float area = PI*r*r;
printf("The area of the circle is %f",area);
return 0;
}

再举一个使用无参数宏代替 字符串的例子:

#define M (y*y+3*y)

#include <stdio.h>

int main()
{
int s,y;
printf("input a number: ");
scanf("%d",&y);
s = 3*M + 4*M + 5*M;
printf("s=%d\n",s);
return 0;
}

# define M (y*y+3*y) 定义 M表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替 ,而对源程序作编译时,将先由预处理程序进行宏代换,即用 (y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。

上例程序中首要 进行宏定义 ,定义 M表达式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏调用。在预处理时经宏打开 后该语句变为:s=3*(y*y+3*y)+4* (y*y+3*y)+5* (y*y+3*y);但要留意 的是,在宏定义 中表达式(y*y+3*y)两边的括号不能少。不然 会发生过错 。

带参数宏定义

  C言语 允许宏带有参数。在宏定义 中的参数称为形式参数,在宏调用中的参数称为实践 参数。对带参数的宏,在调用中,不只 要宏打开 ,并且 要用实参去代换形参。

  带参数宏定义 的一般形式为:

  #define 宏名(形参表) 字符串

  在字符串中含有各个形参。

  带参数宏调用的一般形式为:

  宏名(实参表)

  例如:

  #define M(y) y*y+3*y

  ....

  k=M(5);

  ....

  在宏调用时,用实参5去代替 形参y,经预处理宏打开 后的语句为:

  k=5*5+3*5

举一个详细 例子:

#define MAX(a,b) (a>b)?a:b

#include <stdio.h>

int main()
{
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max = MAX(x,y);
printf("max=%d\n",max);
return 0;

}

上例程序的第一行进行带参数宏定义 ,用宏名MAX表明 条件表达式(a>b)?a:b,形参a,b均呈现 在条件表达式中。程序第七行max = MAX(x, y)为宏调用,实参x,y,将代换形参a,b。宏打开 后该语句为: max = (x>y)?x:y;用于核算 x,y中的大数。

关于 带参的宏定义 有以下问题需要说明:

1. 带参宏定义 中,宏名和形参表之间不能有空格呈现 。

例如把: #define MAX(a,b) (a>b)?a:b写为: #define MAX (a,b) (a>b)?a:b 将被认为是无参宏定义 ,宏名MAX代表字符串 (a,b)(a>b)?a:b。

宏打开 时,宏调用语句: max = MAX(x,y);将变为: max = (a,b)(a>b)?a:b(x,y);这显然是过错 的。

2. 在宏定义 中的形参是标识符,而宏调用中的实参可所以 表达式。

#define SQ(y) (y)*(y)
#include <stdio.h>

int main()
{
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=SQ(a+1);
printf("sq=%d\n",sq);
return 0;

}

您可能还会对下面的文章感兴趣: