C语言学习:宏定义#define

define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。

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

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

宏的定义:

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

下面介绍几种#define的用法:
一、用于定义常量

//一般用法:
#include <stdio.h>
#define PI 3.14 
int main()
{
   
	double R = 2.0;	   //定义圆的半径并初始化为2.0
	double Area = 0.0;//定义圆的面积并初始化为0.0
	Area = PI*R*R;    //圆的面积等于π*R的平方
	printf("%.2lf",Area);//保留2位小数输出Area的值
	return 0;
}

上述例子中,π在main函数中并未赋值也为定义,但是确能够准确输出圆的面积,正是因为在开头使用了#define 定义了PI为3.14,经过宏定义后,在程序中只要出现PI这个字符串,系统都会默认将其用3.14替换掉,这便是宏定义最简单的应用。

二、用于定义一种方法

#include <stdio.h>
#define fun(A) A*A
int main()
{
   
	int a = 10;         //定义一个临时变量a并初始化为10
	int result = 0;     //定义一个临时变量resul用于储存结果
	result = fun(a);    //将宏定义计算后的结果存储于resul中
	printf("%d",result);//输出result的结果
	return 0;
}

看出上述例子输出的结果为100,将fun(A)这个字符串用A*A替换了,这便是宏定义的第二种用法,用于定义一种方法。值得注意的是下面这个例子。

#include <stdio.h>
#define fun(A) A*A
int main()
{
   
	int a = 10;         //定义一个临时变量a并初始化为10
	int result = 0;  //定义一个临时变量resul用于储存调用宏定义后的结果
	result = fun(a);    //将宏定义计算后的结果存储于resul中
	printf("%d\n",result);//输出result的结果
	result = 100/fun(a);
	printf("%d\n",result);
	return 0;
}

这个例子的第二部分输出的不是1却是100!
原因:result = 100/fun(a)被替换后变成了
result = 100 / 10x10=> result=10x10=100。
因为宏定义方法时,程序只负责替换对应字符串并不帮忙加括号控制优先顺序。

若要输出1,这应该这样写代码。
将#define fun(A) AxA 变为 #define fun(A) (AxA)

#include <stdio.h>
#define fun(A) (A*A) //将其括起来
int main()
{
   
	int a = 10;         //定义一个临时变量a并初始化为10
	int result = 0;     //定义一个临时变量resul用于储存调用宏定义后的结果
	result = fun(a);    //将宏定义计算后的结果存储于resul中
	printf("%d\n",result);//输出result的结果
	result = 100/fun(a);
	printf("%d\n",result);
	return 0;
}


结果便是我们想要的1了,具体流程为:
result = 100/fun(a) => result = 100/(10x10) =>result = 100/100 = 1.

总结:#define [想替换的字符串] [目标字符串]
字符串的宏定义方法就是将想替换的字符串在程序中用目标字符串来替换掉,实现更好的代码可读性与可重写性。
(在宏定义方法时,要注意括号的添加与否,是否会修改源程序的优先顺序。)