`
peizhiinfo
  • 浏览: 1429582 次
文章分类
社区版块
存档分类
最新评论

C语言中的带参数宏

 
阅读更多

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语言_带参宏替换计算给定年份的二月天数_chapterbgn_

    C语言带参宏替换计算给定年份的二月天数,供初学者参考

    c语言中可变参数va宏的使用

    主要讲了c语言中可变参数宏的使用,以及它在嵌入式系统中的应用

    带参宏替换计算给定年份的二月天数_C语言_带参宏替换计算给定年份的二月天数_chapterbgn_源码.rar

    带参宏替换计算给定年份的二月天数_C语言_带参宏替换计算给定年份的二月天数_chapterbgn_源码.rar

    c语言中的宏

    如何更高效的使用c语言中的宏, 比如宏函数的定义, 可变参数的处理等

    C语言中define的用法

    define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。 预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。一般都放在源文件的前面,它们称为...无参数宏定义

    C语言 变长参数函数和变长参数宏debugLog

    日志输出函数,往往只接受具体的输出内容,但有时候还要为日志加上时间标志 就需要在打印日志是附加时间,如果改写函数或在调用前手动在日志内容前拼加时间,太麻烦了,所有的代码都要改. ...还是在函数体中增加比较方便.

    C语言中的回调函数实例

    在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个...

    C语言常用调试用函数和宏定义头文件,便捷打印参数信息、输出日志

    C语言常用的调试用函数,例如打印参数名和数值、记录日志文件、格式化打印一维和二维数组、二进制信息等。头文件包含:1、常用数据类型别名;2、重定向printf到日志文件,打印信息可选包含行号,便于调试信息追溯;3...

    c语言难点分析整理,C语言

    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语言来显示图形,运行结果在机子命令符里,可以通过改变参数来改变图形等

    C语言常规优化策略 参数传递、宏定义、全局变量与汇.doc

    C语言常规优化策略 参数传递、宏定义、全局变量与汇

    C语言实验6

    实验内容4:定义一个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 实验要求: 输入事先已编好的程序,并运行该程序。分析运行结果是否正确。

    C 宏定义 编译预处理 PPT

    C语言学习 讲解了宏的定义,带参数宏定义,带参的宏与函数区别,文件包含等

    C语言宏定义详解幻灯片

    宏定义 不带参数宏定义 一般形式: #define 宏名 [宏体] 功能:用指定标识符(宏名)代替字符序列(宏体)

    C语言难点分析整理

    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

    高级C语言详解

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    史上最强的C语言资料

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    谭浩强C语言设计第三版.pdf

     4.4.4 带参数的宏定义  习题四 第5章 数组  5.1 一维数组  5.1.1 一维数组定义及数组元素引用  5.1.2 数组元素的引用方法  5.1.3 一维数组的初始化  5.1.4 一维数组元素的查找与排序  5.1.5 数组与函数  ...

Global site tag (gtag.js) - Google Analytics