做展示型企业网站,交易链接大全,网站的注册页面怎么做,开发财务软件需要多少钱宏#xff08;Macro#xff09;#xff0c;是一种批量处理的称谓。计算机科学里的宏是一种抽象#xff08;Abstraction#xff09;#xff0c;它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言#xff0c;宏…宏Macro是一种批量处理的称谓。计算机科学里的宏是一种抽象Abstraction它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言宏展开在编译时发生进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中它们是源自宏展开的概念这包括键盘宏和宏语言。绝大多数情况下“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
宏是一种预处理指令它提供了一种机制可以用来替换源代码中的字符串。
1、条件编译
C语言中预处理过程读入源代码检查包含预处理指令的语句和宏定义并对源代码进行相应的转换预处理过程还会删除程序中的注释和多余的空白符号。
预处理指令是以#开头的代码行#必须是该行除了空白字符外的第一个字符。#后是指令关键字在#和指令关键字之间允许存在若干空白字符。
使用宏进行条件编译的用法与使用宏防止多重引用类似。示例如下 使用条件编译方便程序员在调试程序的过程中执行一些在程序发布后并不需要执行的指令。只要在需要调试的代码前加上_DEBUG的定义就可以在调试程序的过程中输出调试信息。
这样方便查看程序在运行过程中有没有出现错误定位错误出现的地方。而在程序发布之前取消_DEBUG的定义就可以不再执行调试代码。
2、宏函数
函数的调用是需要一定的时间和空间代价的。因为系统在调用函数时需要保留现场即将程序要执行的指令的下一条指令的位置压入栈然后转入调用函数去执行调用完函数后再返回主调函数恢复现场返回到栈里保存的的下一条指令的位置继续执行。
所以函数的调用需要额外的时间和空间代价。
而宏函数则不存在上述问题宏函数在预编译时同函数定义的代码来替换函数名将函数代码段嵌入到当前程序不会产生函数调用。
所以会省去普通函数保留现场恢复现场的时间但因为要将定义的函数体嵌入到当前程序所以不可避免的会占用额外的存储空间。
在频繁调用同一个宏的时候该现象尤其明显。宏函数的示例定义如下
#define MAX(a,b) ((a)(b)?(b):(a))
宏函数的优点在于避免函数调用提高程序效率。
同时需要注意的是inline标识符。inline也将函数定义为内联的。但是使用内联函数需要注意的是函数体必须十分简单不能含有循环、条件、选择等复杂结构否则就不能作为内联函数了。
事实上有时候即便你没有将函数指定为内联函数编译器也会将一些简单的函数作为内联函数处理而对于一些复杂的函数即使声明为内联函数编译器也不会理会的。
inline函数的瓶颈就在于此使用inline标识符将函数声明为内联的但这只是一种提示到底编译器有没有优化还依赖于编译器的实现而使用宏函数则完全由代码本身控制。
但在使用宏函数的时候需要明确的是宏函数只是简单的替换需要注意括号的使用。
为了能够真正理解#define的作用让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时实际经过了预处理、编译、汇编和连接几个过程。源程序 预处理器 修改后的源程序 编译器 汇编程序 汇编器 可重定位的目标程序 连接器 可执行的目标程序
宏的规则特性
1宏名一般用大写。
2使用宏可提高程序的通用性和易读性减少不一致性减少输入错误和便于修改。例如数组大小常用宏定义。
3预处理是在编译之前的处理而编译工作的任务之一就是语法检查预处理不做语法检查。
4宏定义末尾不加分号。
5宏定义写在函数的花括号外边作用域为其后的程序通常在文件的最开头。
6可以用#undef命令终止宏定义的作用域。
7宏定义不可以嵌套。
8字符串 中永远不包含宏。
9宏定义不分配内存变量定义分配内存。
10宏定义不存在类型问题它的参数也是无类型的。
参考文章https://zhidao.baidu.com/question/414209784.html
参考文章http://blog.chinaunix.net/uid-20606164-id-3280360.html