宏是学习C语言是较早接触到的一种语法,今天对它产生了一些想法,通过查阅一些资料有了进一步的理解。

宏,从汉语字面意义上理解是 大,广的意思,微软为什么把它翻译成宏呢?

可能是因为使用宏的时候,经常把一些大的,多的代码,变成很小的一个字符串或字符,这个小的字符或字符串实际上是包含了“大”的一个抽象的概念,所以翻译成“宏”。也仅仅是我的一个猜测,也便于更好的理解吧。

宏,全称宏指令,使用关键字 define定义,一般出现在代码的顶部,将一个字符串a(或字符)替换为另一个字符串b(或字符),在编译器的预编译阶段,将代码中遇到的所有这个a替换为b。举个例子:

#define a 5
在接下来的编码中直接使用a这个变量,在预编译阶段,编译器会自动将a替换为5。

a就称作是5的一个宏。

那么,一个文件中对于一个字符a来说,只能定义一个宏吗?编码的时候如果不小心在一个文件中同时对a定义了两个宏怎么办呢?编译器又会如何处理这个问题呢?做一个小小的测试:

编写文件testdefine.c

#include "stdio.h"

#define a 6
#define a 7

int main()
{
        printf("%d\n",a);
        return 0;
}

编译以上代码,编译器会发出警告,说a被重复的定义了,但并没有报错


看看运行的结果是什么

结果输出7

说明如果对于一个字符重复的宏定义了,那么编译器会选择最后一次宏定义来替换它,有点像在编写代码时定义的一个变量第二次赋值。

那么如果同一个项目中,不同的文件中对一个字符重复的宏定义了又会产生什么样的效果呢?编译器又是如何处理的呢?做一个小小的测试:

编写文件testdefine.h,同时修改文件testdefine.c

#include <stdio.h>

#define a 5

#include "testdefine.h"

#define a 6

int main()
{
        printf("%d\n",a);
        return 0;
}
编译以上代码,编译器依旧会发出警告,说a被重复定义,不会报错。

运行代码,输出6。说明在定义宏的时候是可以在不同的文件中对相同的字符串定义一个宏的,但是其实意思和第一个例子是一样的,因为在编译阶段,包含的文件相当于它的全部代写在了这个文件中,也就是说先定义a为5,然后再定义a为6,最后输出肯定是a最后一次被定义的值,也就是6。

所以定义一个宏有点类似于定义一个变量,或者是给一个函数换个名字,给一段代码封装到一个类中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值