不带参数的宏定义rtse.docx

不带参数的宏定义rtse.docx

ID:59238720

大小:20.01 KB

页数:8页

时间:2020-09-09

不带参数的宏定义rtse.docx_第1页
不带参数的宏定义rtse.docx_第2页
不带参数的宏定义rtse.docx_第3页
不带参数的宏定义rtse.docx_第4页
不带参数的宏定义rtse.docx_第5页
资源描述:

《不带参数的宏定义rtse.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。格式:#define标识符字符串其中的标识符就是所谓的符号常量,也称为“宏名”。预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。即在对相关命令或语句的含义和功能作具体分析之前就要换:例:#definePI3.把程序中出现的PI全部换成3.说明:(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3

2、)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。(4)宏定义末尾不加分号;(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。(6)可以用#undef命令终止宏定义的作用域(7)宏定义可以嵌套(8)字符串""中永远不包含宏(9)宏定义不分配内存,变量定义分配内存。2.带参数的宏:除了一般的字符串替换,还要做参数代换格式:#define宏名(参数表)字符串例如:#defineS(a,b)a*barea=S(3,2);第一步被换为area=a*b;,第二步被换为area

3、=3*2;类似于函数调用,有一个哑实结合的过程:(1)实参如果是表达式容易出问题#defineS(r)r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#defineS(r)(r)*(r)(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏不存在类型,也没有类型转换。(6)函数只有一个返回值,利用宏则可以设法得到多个值(7)宏展开使源程序变长,

4、函数调用不会(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)1、尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。2、再看下面的语句: #defineASPECT_RATIO1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的

5、代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样所写的符号名不会出现在符号列表中。 解决这个问题的方案很简单:不用预处理宏,定义一个常量: constdoubleASPECT_RATIO=1.653; 这种方法很有效。但有两个特殊情况要注意。 首先,定义指针常量时会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含

6、它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如,要在头文件中定义一个基于char*的字符串常量,要写两次const: constchar*constauthorName="ScottMeyers";可以用const来定义常量,也可以用#define来定义常量。但是前者比后者有更多的优点:(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。(2)有些集成

7、化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。。2.实现机制宏是预处理命令,即在预编译阶段进行字节替换。const常量是变量,在执行时const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态存储区的只读数据区。当你声明该量为常量,即告诉程序和编译器,你不希望此量被修改。程序的实现,为了保护常量,特将常量都放在受保护的静态存储区内。凡是试图修改这个区域内的值,都将被视为非法,并报错。这不能理解为凡是字符串都是放在静态存储区域的。这个跟数据类型没有关系,而是这个量是变量还

8、是常量的问题。例如,一个字符串变量就是可以被修改的。这种静态存储区域的保护机制是由编译器实现的,而非存储该值的内存的电器属性。换言之,实质上内存永远都可以被用户随意修改,只是编译器给用户的代码注入了一些自己的保护代码,通过软件手段将这段内存软保护起来。这种保护在汇编级别可以轻松突破,其保护也就无效了。)。3.用法区别

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。