C语言函数与宏怎么使用
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这篇文章主要讲解了"C语言函数与宏怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言函数与宏怎么使用"吧!一、函数与宏宏是由预处理器直接替换
千家信息网最后更新 2024年11月18日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安全错误
数据库的锁怎样保障安全
3dmax数据库教程
地平线4怎么开私人服务器
美团网络技术部
软件测试必须得在软件开发
无线网络技术导论感悟
数据库课程设计地铁管理系统
大数据网络技术计划表
数据库被盗
传奇开服需要几个服务器
德庆天气预报软件开发
人机交互软件开发流程
软件开发员猝死
mongodb分片几个服务器
河南浪潮服务器维修调试价格
中国产后抑郁症数据库
oracle数据库的名称
数据库五大范式bcnf
杭州它山网络技术
给你300台服务器
部落冲突腾讯服务器
路由器怎么做服务器
图片认字提示服务器错误
电脑网络安全培训教程
手机如何登录本地服务器
计算机软件开发公司和信息化
软件开发技术基础ppt
服务器管理员程序在哪
河南水土保持数据库
政务服务网络安全工作汇报
阿克苏软件开发优缺点