打印
[其它]

c语言中宏的定义方式,简单讲解C语言中宏的定义与使用

[复制链接]
307|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
芯路例程|  楼主 | 2023-1-13 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段。处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等。
使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和于修改。例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用。
语法说明:(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
定义:
#define 宏名 内容
#define kArrLen 10 // OC驼峰命名法:首字符为k,其他单词首字符大写
#define ARR_LEN 10 // C语言中的宏命名规范:所有字母大写,单词用下划线分隔
例如:
#define PI 3.1415926
我们就可以使用 PI 来代替 3.1415926 即可:
float r = 0.5;
float area = PI * r * r;
printf("area = %f\n", area);
在程序预编译阶段会把 PI 替换成 3.1415926:
float area = 3.1415926 * r * r;
宏定义内容很简单,也很好理解,但是有几个如下的注意事项:
1、因为宏定义只是简单的替换,如果宏定义的内容有运算的时候,要把每个变量加上括号,以免影响运算的优先级
比如:#define MUL(A, B) (A * B)
使用方法:
MUL(3 + 5, 5 + 6) //会替换成 3 + 5 * 5 + 6 = 34
我们希望(3 + 5) * (5 + 6),所以定义宏定义的时候应该:
#define MUL(A, B) ((A) * (B))
2、注意宏定义后面没有分号(;),它不是一条语句
3、宏定义是在程序编译前期进行替换,此时程序还没有编译

使用特权

评论回复

相关帖子

沙发
sesefadou| | 2023-2-2 10:04 | 只看该作者
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。

使用特权

评论回复
板凳
olivem55arlowe| | 2023-2-2 14:18 | 只看该作者
C提供的三种预处理功能的其中一种  

使用特权

评论回复
地板
芯路例程|  楼主 | 2023-2-3 14:49 | 只看该作者
olivem55arlowe 发表于 2023-2-2 14:18
C提供的三种预处理功能的其中一种

还有其他两种是什么?

使用特权

评论回复
5
pmp| | 2023-2-4 22:36 | 只看该作者
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。

使用特权

评论回复
6
51xlf| | 2023-2-6 15:46 | 只看该作者
请问C语言中宏定义怎么用               

使用特权

评论回复
7
芯路例程|  楼主 | 2023-2-7 13:50 | 只看该作者
51xlf 发表于 2023-2-6 15:46
请问C语言中宏定义怎么用

就直接#define 这样就可以了。

使用特权

评论回复
8
usysm| | 2023-2-7 20:58 | 只看该作者
对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。  

使用特权

评论回复
9
芯路例程|  楼主 | 2023-2-9 13:20 | 只看该作者
usysm 发表于 2023-2-7 20:58
对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。   ...

不太理解,这么用有什么好处吗?

使用特权

评论回复
10
sesefadou| | 2023-3-2 10:51 | 只看该作者
代码中所有出现的“宏名”,都会被“替换文本”替换。

使用特权

评论回复
11
bartonalfred| | 2023-3-2 11:09 | 只看该作者
预处理指令               

使用特权

评论回复
12
janewood| | 2023-3-2 11:18 | 只看该作者
习惯在名字中只使用大写字母代表宏定义。

使用特权

评论回复
13
cashrwood| | 2023-3-2 11:40 | 只看该作者
在C 语言中,可以采用命令 #define 来定义宏。

使用特权

评论回复
14
1988020566| | 2023-3-2 16:48 | 只看该作者
要求移植性的时候,可采用宏定义简化编程,增强程序可读性。

使用特权

评论回复
15
timfordlare| | 2023-3-3 20:46 | 只看该作者
语言中的宏,是一种可以代表任何语言元素的标识符

使用特权

评论回复
16
juliestephen| | 2023-3-3 20:57 | 只看该作者
使用宏来代替一些常量或表达式,给程序员提供了便利,使程序更加清晰

使用特权

评论回复
17
adolphcocker| | 2023-3-3 21:18 | 只看该作者
可以采用命令 #define 来定义宏。

使用特权

评论回复
18
芯路例程|  楼主 | 2023-3-6 10:32 | 只看该作者
pmp 发表于 2023-2-4 22:36
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。  ...

是的,有时候宏还是很好用的。

使用特权

评论回复
19
芯路例程|  楼主 | 2023-3-6 10:33 | 只看该作者
janewood 发表于 2023-3-2 11:18
习惯在名字中只使用大写字母代表宏定义。

对,这是一种编程习惯。

使用特权

评论回复
20
芯路例程|  楼主 | 2023-3-6 10:33 | 只看该作者
juliestephen 发表于 2023-3-3 20:57
使用宏来代替一些常量或表达式,给程序员提供了便利,使程序更加清晰

对的,代码使用更方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

1303

帖子

1

粉丝