C语言中的带参数宏
一.带参数的宏
1.带参数的宏定义不是简单的字符串替换,还要进行参数替换
定义格式为:
#define 宏名(参数表) 字符串
1>字符串包含括号中所有指定的参数
eg: #define S(a,b) ((a)*(b))
area=S(3,2)
2>编译系统处理带参数的宏名时,按程序行中指定的字符串,括号内的内容,从左到右进行处理,若遇到形参则以实参代替,非形参字符原样保留,就形成了替换后的内容,这期间没有任何计算。
《在宏定义中的参数称为形参,在宏调用中的参数称为实参》
3> 在进行宏定义时,在宏名与带参数的括号之间不应该加空格;否则将空格以后的内容作为替代字符串的一部分,即系统将其看作不带参数的宏定义。
2.带参数的宏定义与函数的区别
1>函数调用时候,先求出实参表达式的值,然后代入形参。而使用带参数的只是简单的字符替换(在宏展开时,并不求实参表达式的值,而之将实参字符代替形参)。
2>函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开是在编译前运行的,在展开时并不分配内存单元,不进行直接的传递处理,也没有返回值的概念。
(函数中以“值传递”,而在带参宏中,只是符号代替,不存在值传递的问题)。
3>函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致则会进行类型转换。而带参数的宏中参数是没有类型的。
宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任意类型的数据。
《带参宏中的形式参数不必要做类型定义,而宏调用中的实参是有具体的值。因此必须对实参做类型说明》
4>使用宏次数多时,宏展开后源程序变长,因每展开一次都会使程序增长,而函数调用不会使源程序变长。
5>宏替换不占用运行时间,只占用编译时间。而函数调用则占用运行时间(分配单元,保留现场,值传递,返回)。
3.带参宏使用注意:
在宏定义中,字符串内的形参通常需要用括号括起来避免出错,
而且应该在整个字符串外加上括号。
eg: #define Q(x)((x)*(x))
分享到:
相关推荐
本文主要讲了c语言带参数的宏定义,下面一起来学习一下
C语言带参宏替换计算给定年份的二月天数,供初学者参考
主要讲了c语言中可变参数宏的使用,以及它在嵌入式系统中的应用
带参宏替换计算给定年份的二月天数_C语言_带参宏替换计算给定年份的二月天数_chapterbgn_源码.rar
如何更高效的使用c语言中的宏, 比如宏函数的定义, 可变参数的处理等
define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。 预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。一般都放在源文件的前面,它们称为...无参数宏定义
日志输出函数,往往只接受具体的输出内容,但有时候还要为日志加上时间标志 就需要在打印日志是附加时间,如果改写函数或在调用前手动在日志内容前拼加时间,太麻烦了,所有的代码都要改. ...还是在函数体中增加比较方便.
在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个...
C语言常用的调试用函数,例如打印参数名和数值、记录日志文件、格式化打印一维和二维数组、二进制信息等。头文件包含:1、常用数据类型别名;2、重定向printf到日志文件,打印信息可选包含行号,便于调试信息追溯;3...
7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...
自动显示是技术知识,并用c语言来显示图形,运行结果在机子命令符里,可以通过改变参数来改变图形等
C语言常规优化策略 参数传递、宏定义、全局变量与汇
实验内容4:定义一个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 实验要求: 输入事先已编好的程序,并运行该程序。分析运行结果是否正确。
C语言学习 讲解了宏的定义,带参数宏定义,带参的宏与函数区别,文件包含等
宏定义 不带参数宏定义 一般形式: #define 宏名 [宏体] 功能:用指定标识符(宏名)代替字符序列(宏体)
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 ...17. C语言宏定义技巧 89
7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...
7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...
4.4.4 带参数的宏定义 习题四 第5章 数组 5.1 一维数组 5.1.1 一维数组定义及数组元素引用 5.1.2 数组元素的引用方法 5.1.3 一维数组的初始化 5.1.4 一维数组元素的查找与排序 5.1.5 数组与函数 ...