1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【C语言】#define定义的标识符和宏

【C语言】#define定义的标识符和宏

时间:2023-09-11 15:18:36

相关推荐

【C语言】#define定义的标识符和宏

目录

1.#define定义标识符

语法

2.#define定义宏

#define替换的规则

#与##

#的用法:

##的用法:

宏的缺点

📢1.#define定义标识符

在C语言程序中,有时候会包含#define

#define可以定义标识符

也就是说可以对字符重新定义,实现代替的作用

📢语法

#define name stuff

就比如说:

#define MAX 1000(用MAX代替1000)

#define reg register (用reg代替register)

📢举个栗子

#include<stdio.h>#define MAX 100int main(){printf("%d", MAX);return 0;}

当代码运行的时候

在代码编译的预处理阶段 就会把宏替换为文本程序代码

代替的结果如下:

#include<stdio.h>int main(){printf("%d", 100);return 0;}

📢注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。

📢2.#define定义宏

#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏

宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销

语法:

#define SQUARE(x) x*x

这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数

📢下面用#define定义宏来实现两个数求最大值

#include<stdio.h>#define MAX(x,y) ((x)>(y)?(x):(y))int main(){int a = 20;int b = 10;int c = MAX(a,b);printf("%d", c);return 0;}

替换后的结果为:

#include<stdio.h>int main(){int a = 20;int b = 10;int c = a>b?a:b;printf("%d", c);return 0;}

在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立

这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了

举个栗子:

#include<stdio.h>#define sum(x) x*xint main(){int ret = sum(3 + 3);printf("%d", ret);}

如果不仔细观察的话,可能你认为的结果就是36

这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)

📢#define替换的规则

#define定义标识符和宏时,程序会继续如下步骤

1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换

2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换

3.最后进行检查,果然还有#define定义的符号,将重复上述的操作

注意:

1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归

2.如果#define的参数名存在在字符串中,将不会完成替换

📢#与##

#的用法:

在不确定参数的情况下,可以使用“#n” ,可以实现不同字符串的插入

效果如下:

#include<stdio.h>#define PRINT(n) printf("the value of "#n" is %d\n",n);int main(){int a = 10;PRINT(a);int b = 20;PRINT(b);int c= 30;PRINT(c);return 0;}

📢替换后的效果为:

#include<stdio.h>int main(){int a = 10;printf("the value of" "a" " is %d\n",a);PRINT(a);int b = 20;PRINT(b);printf("the value of " "b" " is %d\n",b);int c= 30;PRINT(c);printf("the value of " "c" " is %d\n",c);return 0;}

##的用法:

#include<stdio.h>#define CAT(Max,num) Max##nuint main(){int Maxnum = 100;printf("%d", Maxnum);return 0;}

双##的用法可以拼接两个字符串

当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的

📢宏的缺点

1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度

2.宏是没法调试的

3.宏与类型无关,导致程序不够严谨

4.宏会带来优先级的问题,容易导致程序的错误

欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。