【编程经验】宏定义

预处理命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对它们进行编译,必须在对程序进行编译之前,先对程序中这些特殊的命令进行“预处理” 。

经过预处理后,程序就不再包括预处理命令了,最后再由编译程序对预处理之后的源程序进行编译处理,得到可供执行的目标代码。C语言提供的预处理功能有三种,分别为宏定义、文件包含和条件编译,下面将对它们进行简单介绍:

宏定义:在 C语言源程序中允许用一个标识符来表示一个字符串,称为“宏” ,被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。

宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,其定义的一般形式为: #define 标识符 字符串;

其中“#”表示这是一条预处理命令(在 C 语言中凡是以“#”开头的均为预处理命令)“define”为宏定义命令,“标识符”为所定义的宏名, “字符串”可以是常数、表达式、格式串等。符号常量的定义就是一种无参宏定义。

此外,常常对程序中反复使用的表达式进行宏定义。例如: #define M (y*y+3*y);

它的作用是指定标识符 M 来代替表达式(y*y+3*y)

在编写源程序时, 所有的(y*y+3*y)都可由 M 代替, 而对源程序进行编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名 M,然后 再进行编译。

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对于带 参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为: #define 宏名(形参表) 字符串; 在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(实参表); 例如:

#define M(y) y*y+3*y/*宏定义*/

......

k=M(5);/*宏调用*/

在上面的宏调用时,用实参 5 去代替形参 y,经预处理宏展开后的语句为: k=5*5+3*5; 以下程序给出了一个宏定义和调用的完整实例。

定义一个名为 MAX 的带参数的宏,可以通过它来选出参数 a、b 中的较大值:test26.c

程序运行结果如下(□表示空格,↙表示回车) :

input two numbers: 2009□2010↙

max=2010

可以看到,宏替换相当于实现了一个函数调用的功能,

而事实上,与函数调用相比,宏调用更能提高C程序的执行效率。

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2018-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

js代码规范

20. 判断是否相等时候 采用=== 判断包括类型的相等 21. 尽量使用语法严格模式 消除代码之中的不友好;代码运行更快 ;保证运行的安全 ;为新版本的...

1653
来自专栏数据结构与算法

P2085 最小函数值(minval)

题目描述 有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Aix^2+Bix+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数...

3245
来自专栏十月梦想

流程控制的另一种书写方式

多个层次的嵌套会有多个括号看起来比较繁琐,流程控制可以用:代表左侧的{;endif、endswitch、endfor、endwhile、endforeach代表...

907
来自专栏GreenLeaves

JavaScript引用类型之RegExp类型(正则表达式)

ECMAScript中使用RegExp来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。 var expression=/pattern...

19610
来自专栏Golang语言社区

Golang 基本语法学习笔记之流程控制

条件判断 //实例 func fn01(x int) int { var a int if a = 4; x == 0 {...

27412
来自专栏大前端_Web

javascript事件监听中传递匿名函数(嵌套定义的命名函数)与命名函数的区别

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1154
来自专栏Golang语言社区

Golang语言--指针

在Go中指针是很容易学习的。一些进入编程任务,指针更容易操作,如通过引用调用,需要要使用指针来执行。所以学习指针成为完美Go程序员很有必要。让我们开始学习指针的...

36612
来自专栏Golang语言社区

Golang语言--可变参数函数,何时该使用省略号(...)

今天的一个例子中发现,对于在调用可变参数函数时,不是总能使用省略号将一个切片展开,有时候编译器可能会报错,为了清除的说明这个问题,我用几个小例子一步一步说明。 ...

47710
来自专栏前端桃园

看完这几道 Promise 面试题,还被面试官问倒算我输

最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧。

1061
来自专栏移动开发

java split()

java提供了split根据传入的分隔符,返回数组的方法.但是对于一些特殊字符我们要注意下,以防获取的不是我们想要的结果. 如想要根据”竖线”分隔:

981

扫码关注云+社区

领取腾讯云代金券