28人参与 • 2026-01-11 • C/C++
#define 是 c 语言预处理指令,用于在预处理阶段完成文本替换,不占用运行时内存,是实现代码复用、常量定义、简化复杂逻辑的核心工具。它分为 无参宏 和 带参宏 两类,底层依赖预处理阶段的“字符串替换”机制。
#define 宏名 替换文本
#include <stdio.h>
// 定义数值常量
#define max_num 100
// 定义字符串常量
#define msg "hello, macro!"
// 定义表达式
#define mul(a, b) a*b // 注意:这是带参宏,此处仅举例
int main() {
int arr[max_num]; // 替换为 int arr[100];
printf("%s\n", msg); // 替换为 printf("%s\n", "hello, macro!");
printf("%d\n", max_num * 2); // 替换为 printf("%d\n", 100 * 2);
return 0;
}
#define max 100; int a = max + 5; // 替换后变成 int a = 100; +5; → 语法错误
#define max 100 #undef max // 此后 max 宏失效 int a = max; // 编译报错
#define 宏名(参数列表) 替换文本
#include <stdio.h>
// 求两数最大值
#define max(a, b) ((a) > (b) ? (a) : (b))
int main() {
int x = 10, y = 20;
// 替换为 ((10) > (20) ? (10) : (20))
int max_val = max(x, y);
printf("max: %d\n", max_val); // 输出 20
return 0;
}
带参宏的最大坑点是缺少括号导致的运算优先级错误,必须给参数和整个表达式加括号。
反例:无括号导致错误
#define mul(a, b) a * b
int main() {
// 期望:(2+3)*(4+5)=5*9=45 → 实际替换为 2+3*4+5=2+12+5=19
int res = mul(2+3, 4+5);
printf("%d\n", res); // 输出 19,与预期不符
return 0;
}
正例:加括号避免陷阱
#define mul(a, b) ((a) * (b)) int res = mul(2+3, 4+5); // 替换为 ((2+3)*(4+5)) → 45,正确
| 特性 | 带参宏 | 函数 |
|---|---|---|
| 处理阶段 | 预处理阶段文本替换 | 编译、运行阶段执行 |
| 内存占用 | 无运行时开销,替换后代码膨胀 | 有函数调用开销(栈帧创建/销毁) |
| 类型检查 | 无参数类型检查 | 严格的参数/返回值类型检查 |
| 返回值 | 无返回值,直接替换表达式 | 有明确返回值类型 |
| 适用场景 | 简单运算(如加减乘除、三目运算) | 复杂逻辑、循环/分支语句 |
作用:将宏参数转换为字符串常量,语法 #参数名 。
#include <stdio.h>
#define print_var(var) printf(#var " = %d\n", var)
int main() {
int a = 10, b = 20;
// 替换为 printf("a" " = %d\n", a) → 字符串拼接为 "a = %d\n"
print_var(a); // 输出 a = 10
print_var(b); // 输出 b = 20
return 0;
}
作用:将两个标识符拼接成一个新标识符,语法 标识符1 ## 标识符2 。
#include <stdio.h>
#define create_var(prefix, num) prefix##num
int main() {
// 拼接为 var1
int create_var(var, 1) = 100;
// 拼接为 var2
int create_var(var, 2) = 200;
printf("%d\n", var1); // 输出 100
printf("%d\n", var2); // 输出 200
return 0;
}
#define 常与 #ifdef / #ifndef 配合实现条件编译,用于跨平台代码、调试模式开关。
#include <stdio.h>
// 定义 debug 宏,开启调试模式
#define debug
int main() {
int a = 10;
// 若定义了 debug,则执行 printf
#ifdef debug
printf("debug: a = %d\n", a); // 调试时输出
#endif
// 若未定义 release,则执行下面代码
#ifndef release
printf("not release mode\n");
#endif
return 0;
}
到此这篇关于浅谈c语言中的 #define 宏定义的文章就介绍到这了,更多相关c语言 #define 宏定义内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论