C语言函数与宏怎么使用
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要讲解了"C语言函数与宏怎么使用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C语言函数与宏怎么使用"吧!一、函数与宏宏是由预处理器直接替换
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
网站的服务器太繁忙怎么办
网络安全与执法的专业类别
网页版传奇服务器端
服务器可以应用多开吗
数据库显示语句
幽宝可梦服务器
杭州吾动网络技术
网络安全海报手绘简介
下列哪些是数据库保护方面的内容
软件开发公司会议总结范文
网络技术开发实训报告
海南毅鑫网络技术有限公司
关于网络技术得梦想得征文
服务器主机启动怎么设置
gta游戏服务器失败
计算机软件开发大脑壳
传奇装备数据库
奔驰服务器
麻城网络安全
在哪里找服务器我的世界
合川区网络安全发展中心
豫教思语网络安全知识答案
国产服务器是哪些
常用医学数据库管理系统有哪些
西宁网络技术参数
政法网络安全与执法专业
马鞍山oa管理软件开发哪家好
固安 软件开发
监狱网络安全防御建设现状
合肥市肥西互联网科技有限公司