返回介绍

10.2.1 宏的定义

发布于 2025-04-11 22:33:06 字数 2019 浏览 0 评论 0 收藏 0

可以通过#define 命令来定义一个宏。具体的格式为:

#define 宏名 宏值

宏名是一个标识符,为所定义宏的名字,可使用在源代码中。宏值为宏名所对应的值,它可以是一个常数、表达式、字符、字符串等。需要注意的是,宏定义并非 C 语言的语句,因此最后不需要加上分号。

下面就用程序代码来演示宏的定义和使用。

这段代码中,通过#define 命令进行了宏定义,宏名为 LEN,宏值为常数 10。在 for 循环中用到了这个宏。

下面,使用 gcc 加上“-E”选项对源文件进行预处理,便可得到宏替换之后的内容,如图 10.5 所示。

图 10.5 宏替换之后的内容

由于程序包含了头文件“stdio.h”,因此,在对源代码预处理后,前面的大部分内容都是头文件中的内容。从结果可见,原先宏定义的部分已经没有了,但在 for 循环中用到宏 LEN 的地方,已被替换为它所对应的宏值(常数 10)。

在使用宏的时候,有个需要特别注意的地方,就是预处理器对宏的处理只是简单的替换行为,因此,稍不小心就可能会产生令人匪夷所思的结果。例如:

#define NUM 2 + 3

定义了宏 NUM,它的值为表达式“2 + 3”。下面在主函数中来使用这个宏:

定义了 int 类型变量 n,并将“NUM * NUM”作为其初始化的值。按照最初设想,宏 NUM 的值为 2 与 3 的和,即 5,因此,变量 n 的初始值应该为 5 与 5 的乘积,即 25。但对该程序编译运行后,发现结果如下:

n = 11

最终变量 n 的值为 11,并非所设想的 25。这是什么原因呢?

下面来看一下对源代码预处理之后的内容,如图 10.6 所示。

图 10.6 预处理后的内容

从预处理的结果可见,经过宏替换之后,源代码中的语句“int n = NUM * NUM;”会被替换为“int n = 2 + 3 * 2 + 3;”,由于乘法的优先级高于加法,因此,结果便为“2 + 6 + 3”的值,即 11。

如何解决这个问题呢?其实很简单,给宏值加上小括号即可。

#define NUM (2 + 3)

这样经过宏替换之后,源代码中的语句“int n = NUM * NUM;”会被替换为“int n =(2 + 3) * (2 + 3);”,由于小括号的优先级高于乘法,因此,结果便为“5 * 5”的值,即 25。

再次编译运行程序,结果如下:

n = 25

最后要强调是,不要重复定义相同的宏,不然编译的时候会给出重复定义的警告信息。另外,宏的作用域是从宏定义处开始,直至文件末。因此不能在宏定义之前使用宏,不然编译时,就会给出“undeclared”的错误提示。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。