简单吗?
1.宏的基本信息
(1)#define 在预处理过程中处理
(2)#定义的宏可以在程序任意位置出现
(3)#define定义的宏常量本质为字面量
先来探讨下面的这几个宏正不正确
#define ERROR -1
#define PATH1 "D:\test\test.c"
#define PATH2 D:\test\test.c
#define PATH3 D:\test\
test.c
int main()
{
int err = ERROR;
char* p1 = PATH1;
char* p2 = PATH2;
char* p3 = PATH3;
}
单步编译:gcc -E test.c -o test.i
程序并没有报错,预处理器,只进行文本替换,不会进行语法检查,如下所示。

完整编译: gcc test.c
报错,因为替换后的19、20行代码是有语法错误的,不符合C语言的语法规范,过不了编译器这关,所以编译器会报错。
宏常量预编译的时候已经文本替换掉了,所以不占用内存空间,const只读变量占用内存空间。只要是变量都会占用内存空间的,常量都不会占用内存空间,例如整型常量(整数)、实型常量(含有小数)、字符常量、字符串常量、宏常量(又叫符号常量或define宏)都不会占用内存空间。
2.宏表达式分析
#define 表达式的使用类似函数调用
#define 表达式可以比函数更强大,但也更容易出错
示例代码
#include <stdio.h>
#define _SUM_(a, b) (a) + (b)
#

本文详细介绍了C语言宏的基础信息,包括#define定义的宏在预处理过程中的文本替换特性,强调了宏不进行语法检查和变量替换的特性,指出宏表达式可能产生的错误,如不支持递归和作用域限制。同时,讨论了常见内置宏的用途,并通过示例程序展示了宏的强大功能及其潜在副作用。
最低0.47元/天 解锁文章
655

被折叠的 条评论
为什么被折叠?



