一.什么是#define
C语言中,可以用 #define 定义一个标识符来表示一个常量。
特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
二.#define的一般形式
用 #define 定义标识符的一般形式为:
#define 标识符 常量
注意⚠️:最后没有分号
#define又称宏定义,标识符为所定义的宏名,简称宏。
标识符的命名规则与前面讲的变量的命名规则是一样的。
#define 的功能是将标识符定义为其后的常量。一经定义,程序中就可以直接用标识符来表示这个常量。是不是与定义变量类似?但是要区分开!变量名表示的是一个变量,但宏名表示的是一个常量。可以给变量赋值,但绝不能给常量赋值。
三.#define如何工作?
其实预编译所执行的操作就是简单的**“文本”替换**。对宏定义而言,预编译的时候会将程序中所有出现“标识符”的地方全部用这个“常量”替换,称为“宏替换”或“宏展开”。替换完了之后再进行正式的编译。所以说当单击“编译”的时候实际上是执行了两个操作,即先预编译,然后才正式编译。#include<stdio.h>也是这样的,即在预处理的时候先单纯地用头文件stdio.h中所有的“文本”内容替换程序中#include<stdio.h>这一行,然后再进行正式编译。
四.终止宏 #undef
如果要终止其作用域可以使用 #undef 命令,格式为:
#undef 标识符
五.注意
程序中用双引号括起来的宏在预处理的时候是不会被宏替换的。因为在 C 语言中,用双引号括起来表示的是字符串。
# include <stdio.h>
# define PI 3.14159
int main(void)
{
double r, s;
printf("请输入圆的半径:");
scanf("%lf", &r); //scanf中, double只能用%lf
s = PI * r * r;
printf("s=PI*r^2 = %.6f\n", s); //PI不会被宏替换
return 0;
}
Output:
请输入圆的半径:1
s=PI*r^2 = 3.141590
六.define与const区别
角度1:
就定义常量说的话:
const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。
角度2:
就起作用的阶段而言:
define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
角度3:
就起作用的方式而言:
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:
#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5
《#define和const的区别》https://blog.csdn.net/yi_ming_he/article/details/70405364