define本质上是将文本内容在编译时进行替换,又因为他可以替换参数所以就出现了宏。
#define
替换文本
语法:#define name stuff
举一个例子
#define MAX 1000
#define reg register //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ ,\
__DATE__,__TIME__ )
我们C语言的程序员内部有默契,我们把#define
定义的一般做全大写函数命名一般不是全大写一般是首字母大写或其他部分大写,当然我们宏定义假做成函数也会没有全大写。
#define定义宏
#define允许把参数替换到文本中,这种实现通常被称为宏,或定义宏
define
name(由逗号隔开的符号) stuff
举例:
#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
printf("%d", SQUARE(3));
return 0;
}
![[202201210943514.png]]
值得注意的是:
上面的宏其实有一个很大的弊病.
我们用下面的代码来说明:
#include<stdio.h>
#define SQUARE(x) x * x
int main()
{
printf("%d", SQUARE(3+2));
return 0;
}
![[202201210945131.png]]
这并不是我们想要的答案我们想得到5*5可是这个宏定义给的式子却给了我们11这是因为我们在定义宏时没有考虑到运算的优先级.
首先我们的宏在编译阶段会直接和代码替换本次的宏就将printf函数内容进行了替换使SQUARE(3+2)替换成了3+2*3+2这样我们就得到了11的值。
所以使用宏的时候一定要加括号!加括号!
#include<stdio.h>
#define SQUARE(x) ((x) * (x))
int main()
{
printf("%d"