C语言函数与宏怎么使用
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要讲解了"C语言函数与宏怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言函数与宏怎么使用"吧!一、函数与宏宏是由预处理器直接替换
千家信息网最后更新 2026年11月04日C语言函数与宏怎么使用
这篇文章主要讲解了"C语言函数与宏怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言函数与宏怎么使用"吧!
一、函数与宏
宏是由预处理器直接替换展开的,编译器不知道宏的存在
函数是由编译器直接编译的实体,调用行为由编译器决定
多次使用宏会导致最终可执行程序的体积增大
函数是跳转执行的,内存中只有一份函数体存在
宏的效率比函数要高,因为是直接展开,无调用开销
函数调用时会创建活动记录,效率不如宏
下面看一个函数与宏的示例,先看这个程序:
#include#define RESET(p, len) \ while( len > 0 ) \ ((char*)p)[--len] = 0 void reset(void* p, int len){ while( len > 0 ) ((char*)p)[--len] = 0;} int main(){ int array[] = {1, 2, 3, 4, 5}; int len = sizeof(array); int i = 0; RESET(array, len); for(i=0; i<5; i++) { printf("array[%d] = %d\n", i, array[i]); } return 0;}
输出结果如下:

但是如果我们这么写,RESET(6, len); 程序直接出现段错误,都没有给出警告:
而我们使用函数 reset(6, len); 时,则会出现警告:
所以说能用函数实现的功能就尽可能的不使用宏。
宏的效率比函数稍高,但是其副作用巨大
宏是文本替换,参数无法进行类型检查
可以用函数完成的功能绝对不用宏
宏的定义中不能出现递归定义
下面看一个宏的副作用的代码:
#include#define _ADD_(a, b) a + b#define _MUL_(a, b) a * b#define _MIN_(a, b) ((a) < (b) ? (a) : (b)) int main(){ int i = 1; int j = 10; printf("%d\n", _MUL_(_ADD_(1, 2), _ADD_(3, 4))); printf("%d\n", _MIN_(i++, j)); return 0;}
输出结果如下:
按理说输出结果应该是 21 和 1 ,为什么是 11 和 2 呢?下面进行单步调试,输入 gcc -E test.c -o test.i ,得到 test.i 文件,部分结果如下:
这样就能解释了。
二、宏的妙用
用于生成一些常规性的代码
封装函数,加上类型信息
下面看一个宏的妙用的示例:
#include#include #define MALLOC(type, x) (type*)malloc(sizeof(type)*x)#define FREE(p) (free(p), p=NULL) #define LOG_INT(i) printf("%s = %d\n", #i, i)#define LOG_CHAR(c) printf("%s = %c\n", #c, c)#define LOG_FLOAT(f) printf("%s = %f\n", #f, f)#define LOG_POINTER(p) printf("%s = %p\n", #p, p)#define LOG_STRING(s) printf("%s = %s\n", #s, s) #define FOREACH(i, n) while(1) { int i = 0, l = n; for(i=0; i < l; i++)#define BEGIN {#define END } break; } int main(){ int* pi = MALLOC(int, 5); char* str = "AutumnZe"; LOG_STRING(str); LOG_POINTER(pi); FOREACH(k, 5) BEGIN pi[k] = k + 1; END FOREACH(n, 5) BEGIN int value = pi[n]; LOG_INT(value); END FREE(pi); LOG_POINTER(pi); return 0;}
输出结果如下:
输入 gcc -E test.c -o test.i ,看看中间文件 test.i,就能理解这段宏的巧妙之处。
int main(){ int* pi = (int*)malloc(sizeof(int)*5); char* str = "AutumnZe"; printf("%s = %s\n", "str", str); printf("%s = %p\n", "pi", pi); while(1) { int k = 0, l = 5; for(k=0; k < l; k++) { pi[k] = k + 1; } break; } while(1) { int n = 0, l = 5; for(n=0; n < l; n++) { int value = pi[n]; printf("%s = %d\n", "value", value); } break; } (free(pi), pi=((void *)0)); printf("%s = %p\n", "pi", pi); return 0;}感谢各位的阅读,以上就是"C语言函数与宏怎么使用"的内容了,经过本文的学习后,相信大家对C语言函数与宏怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
函数
结果
语言
编译
输出
效率
程序
编译器
学习
代码
内容
副作用
功能
妙用
文件
是由
示例
类型
宏宏
输入
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡豆
科技互联网产品
科技和互联网公司
互联网科技与金融科技
奇酷互联网科技
礼当家互联网科技
深圳天众互联网科技公司
互联网教育科技公司vipkid
互联网大会黑科技排名
成都铂石互联网科技做什么的
科技互联网大厂
湖南一路畅行互联网科技
注册互联网科技公司经营范围大全
恒生互联网科技指数跳水
亳州好赞互联网科技有限公司
本届互联网博览会上的黑科技
东莞新华互联网科技学校
互联网金融科技公司的优势
互联网金融运营模式中的金融科技
青岛互联网科技园
互联网与科技
科技创新互联网企业
友谊互联网络科技
互联网教育科技公司vipkid
互联网时代科技改变生活
成都铂石互联网科技做什么的
呼和浩特新华互联网科技学院
互联网数据科技专业
沐思想互联网科技有限公司
武汉亿视互联网科技有限公司