C 宏定义及函数宏定义
C语言宏定义 参考连接: https://blog.csdn.net/u013910522/article/details/22672057https://www.cnblogs.com/bytebee/p/8205707.html宏定义的优点:1. 便于代码的移植和可读 例如:使用宏定义替一个在程序中经常使用的常量或变量类型,便于全局修改和使用;2. 提高程序运行效率函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。宏定义的缺点:1. 无法对宏定义中的变量类型是否匹配进行检查宏定义变量,是Compile-Time时期的变量,系统在编译时候,就将其全部替换,而不会对其变量进行类型检查,相对不是很安全,可能存在潜在的问题,而没有发现.2. 未加括号带来的边界效应由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是用户所希望的。[例子] 传递参数是变量的表达式#define MUL(A,B) A*B而在使用的时候,这样的调用:int a=1,b=2,c=3,d=0;d=MUL(a+b,c)经过编译时候展开,就变成了d=a+b*c而不是我们所希望的d=(a+b)*c[解决办法]其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题即,在宏定义的时候,如此定义:#define MUL(A,B) ((A)*(B))[例子] 在define数据类型的时候, 未加括号带来的问题#define dPS struct s * //注意末尾无分号当使用的时候,遇到:dPS p1,p2;的时候,经过编译时候替换扩展,就变成了struct s* p1,p2;而p2就不是我们所希望的s的指针类型了,而是一个普通的s数据结构类型的了.产生了边界效应.[解决办法]对应的解决办法也很简单,就是,遇到此类新数据类型定义的时候,还是用typedef将上述宏定义改为:typedef struct s * tPS; // 注意末尾有分号而后的使用:tPS p1,p2;就正常了./// 函数宏定义用途1:简单函数可以用宏定义代替,以便于代码可读性与运行效率隐含的优点为:函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。而宏定义则可以使用任何类型的变量。[例子] 求2个变量最大值的函数宏定义实现: #define MAX( a, b) ( (a) > (b) (a) : (b) )函数来实现:int max( int a, int b){return (a > b a : b)}用途2:传递带参数类型的宏解释:参数类型没法作为形参一部分传递给函数,但是可以把参数类型传递给带参的宏。[例子] 传递参数类型的函数宏定义#define MALLOC(n, type) \( (type *) malloc((n)* sizeof(type)))利用这个宏,就可以为任何类型变量分配一段我们指定的空间大小,并返回指向这段空间的指针。宏确切的工作过程:int *ptr;ptr = MALLOC ( 5, int );将这宏展开以后的结果:ptr = (int *) malloc ( (5) * sizeof(int) );这个例子是宏定义的经典应用之一,完成了函数不能完成的功能。
C 宏定义及函数宏定义相关推荐
- python怎么定义一个函数_Python定义一个函数的方法
Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具.定义函数需要用 def 关键字实现,具体的语法格式如下: def 函数名(形参列表): //由零条到多条可执 ...
- 程序设计C语言函数定义,编程函数的定义之C语言
编程函数的定义之C语言 类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型.接下来,小编为您介绍了编程函数的定义之C语言,感谢您的阅读! 无参函数的定义 无参函数定义的`一般形式如下:类 ...
- 用matlab定义位移函数,matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)...
matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法),哪吒游戏网给大家带来详细的matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)介绍,大家可以阅读一下,希望这篇 ...
- c语言宏定义(c语言宏定义是什么意思)
C语言宏定义名可以有括号和分号吗? 宏定义的名称,是C语言标识符的一种,和函数名,变量名的命名规则是一样的,只允许使用数字,字母,下划线,且不能以数字开头. 所以宏名是不可以有括号和分号的. 另外,在 ...
- 【转自猫大】宏定义的黑魔法 - 宏菜鸟起飞手册
宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...
- python中怎么调用函数_浅谈Python中函数的定义及其调用方法
一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...
- python函数定义及调用-浅谈Python中函数的定义及其调用方法
一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数�C封装独立的功能 2.调用函数�C享受封装的成果 函数的作用:在开 ...
- 函数的定义和形参/实参
1,函数:我们定义好一个事情,等想用的时候直接拿出来就行了,代码不用每次都写,节省无用功,(就好比把一次性做好的红烧肉放到冰箱里,什么时候想吃,就拿出来吃就好了,不用再费时费力去做了) 函数的官方定义 ...
- js函数的定义及同名函数覆盖问题
js函数的定义 用函数声明语法定义 用函数表达式定义 使用Function的构造函数 当分别用前两种方式定义同一个函数时 用函数声明语法定义 function add(num1,num2){var s ...
最新文章
- 数据中心的运维管理原则(一)
- ThreadPoolExecutor线程池的理解与应用
- Kettle使用_18 分组组件计算百分位数
- 海思Hi3516A(5)3D降噪
- 大型网站架构演化(二)——应用服务和数据服务分离
- 购房者一次性付清和还贷三十年,差别有多大?
- AI、大数据、中台、AIoT、Fintech等十余场火热专题应有尽有,年度盛会BDTC 2019邀您共赴!...
- Mybatis体系结构及工作流程
- 软件测试经典问题——NextDate函数
- mysql8 bigint类型和datetime类型的转换
- 莫兰迪颜色表以及RGB向16进制颜色的转换连接
- MATLAB符号运算——积分
- 【ML】机器学习(西瓜书)思维导图
- 电脑声控 电脑机器人功能
- 魔改一波合成大西瓜!代码已开源~
- CM安装成功,CM的web界面登录不上解决方案
- android 分享到微博客户端,Android APP集成新浪微博分享功能
- 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割
- 问题七:vue+ts The left-hand side of an assignment expression may not be an optional property?
- 通过注册表隐藏任务栏
热门文章
- 活动回顾丨欧米区块链——数字资产服务商沙龙
- 计算机在交通规划中的应用,浅谈计算机在交通运输行业中的应用
- 一些非Windows系的语言,工具介绍
- 【已禁用】WeixinJSBridge:微信浏览器内置JavaScript 对象
- 使用公共 Registry - 每天5分钟玩转 Docker 容器技术(19)
- 严魏敏-习题-排序-08
- iOS 生成条纹图片
- 华为powered by android,华为手机鸿蒙 OS 2.0 开机界面终于去掉了 Powered by Android
- 统计学(三):置信区间; Z 检验(样本平均数的假设检验), 均值分布, 附Python实现(大牌护肤品碧欧泉背后的秘密)
- java数组遍历最快方式_java数组遍历的方法