在C语言中,宏(Macro) 是由预处理器处理的文本替换机制,本质上是将一个标识符(宏名)定义为特定的字符串或代码片段。它在编译前展开,不涉及运行时计算。以下是核心要点:
#define 宏名 字符串
#define PI 3.14159
,后续所有PI
会被替换为3.14159
。#define SUM a+b
),直接替换可能导致运算优先级错误(如SUM*2
展开为a+b*2
),需加括号:#define SUM (a+b)
。#define 宏名(参数) 字符串
#define MAX(x,y) ((x)>(y)?(x):(y))
,调用MAX(3,5)
展开为((3)>(5)?(3):(5))
。#undef 宏名
可提前终止作用域。#define AREA(r) (PI*(r)*(r))
)。#
:将参数转为字符串(#define STR(x) #x
→ STR(abc)
展开为"abc"
)。##
:连接参数(#define CONCAT(a,b) a##b
→ CONCAT(var,1)
展开为var1
)。#define SIZE 100
),无需全局查找替换。#ifdef
、#ifndef
实现跨平台或调试代码控制(如#ifdef DEBUG
)。MAX(i++,5)
),展开后可能多次自增(((i++)>(5)?(i++):(5))
)。\
续行,且行尾不能有空格。#define MALLOC(n) malloc(sizeof(int)*(n))
)。宏是C语言预处理的核心工具,通过文本替换提升代码灵活性和效率,但需谨慎处理优先级、副作用等问题。合理使用可优化代码结构,滥用则易引发维护隐患。建议复杂逻辑用函数替代,宏仅用于简单、高频操作的场景。