关于宏的作用域
1. 宏没有可见域。
如果说有,那就是从本文件(包括被包含的文件)中,该宏定义处开始,至文件的尾部或取消宏(#undef)为止。
2. 考虑一种特殊情况:
一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义名字重复了最多是编译警告。可是如果不在结构体之内,名字重复可肯定是error。(未证实,可以做实验,而且可以把两处的宏定义成不同的值,会是什么情况?)
定义在结构体之内的宏在结构体内可以隐藏定义在结构体之外定义的宏,如果都在结构体之外定义,那么就是定义了两个相同的宏,而一个在内,一个在外,则结构体内只看到内部定义的宏,而结构体外只看到外部定义的宏,跟变量的隐藏类似。
宏的处理是在编译的预处理阶段完成的。预处理器根本就不认识什么结构体,在C语言编译器编译这个C文件中的结构体时,这个define语句已经不存在了。相应的,用到这个宏的地方,宏本身也已经替换成宏的值(这个宏展开)。大家可以用gcc -E命令来只做预处理而不编译,看看出来后的文件。
至于为什么在结构体里头#define,是因为这个宏一般用于定义该结构体里头的标志位变量的可能的值,和结构体的这个变量密切相关。放在一起从逻辑上比较容易理解。
今天看到一段代码,里面有个结构体的定义中还包含了常量的宏定义,以前没有见过,感觉很奇怪,不知道进行预处理时,预处理会做何处理,因此想请大家来看看,这样做有什么含义,为什么不把这些定义放在结构体定义的外部呢?
比如
typedef struct aaa
{
.....
#define STATUS_1 0X02
#define STATUS_2 0X04
#define STATUS_1 0X08
....
}
跟放在外面一样
不过这几个宏只在本结构体内使用,代码读起来比较方便
我开始也怀疑作用域的问题,看来这不成问题了!
综上:是否该宏定义与放在外部是等同的,编译预处理器同样在内存中为每一个定义存储一个常量,而程序中各个部分都能毫无分别的使用该定义呢?而这样写的目的只是在开发过程中便于程序员理解该定义的逻辑意义.
Top
回复人: jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!) ( ) 信誉:101 2005-10-13 9:30:51 得分: 0
也许把 没有很注意这个问题哦 自己也没有这样用过 呵呵
Top
回复人: lengxiao_wang() ( ) 信誉:100 2005-10-13 13:39:23 得分: 0
补充一下:宏的作用域的问题可以使用#undef/#endif 对定义即可。但是有一点你得注意,不能再函数体内定义宏。
Top
回复人: snowbirdfly(好好学习~好好动手~~~) ( ) 信誉:100 2005-10-13 14:16:28 得分: 0
个人感觉就是便于阅读程序,容易理解~~~
Top
回复人: DiabloWalkOnTheEarth(WorldOfWg( 狗城是个烂代理 )) ( ) 信誉:97 2005-10-13 14:32:29 得分: 0
谁说不能在函数体内定义宏, 只要喜欢, 什么地方定义宏根本就木关系. 宏本来就不是 语言的一部分, 预处理器也根本不会知道宏定义是在结构内还是结构外, 函数内还是函数外.
Top
回复人: bailingke(大钊) ( ) 信誉:100 2005-10-13 14:50:27 得分: 0
编译器根本不知道有什么宏,编译器单元中只有宏定义后面的数字,跟作用域有什么关系?
Top
回复人: zw_2046(悬崖) ( ) 信誉:100 2005-10-13 17:18:00 得分: 0
看来得回家动手试试才知道了哦!
关于宏的作用域
1. 宏没有可见域。
如果说有,那就是从本文件(包括被包含的文件)中,该宏定义处开始,至文件的尾部或取消宏(#undef)为止。
2. 考虑一种特殊情况:
一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义名字重复了最多是编译警告。可是如果不在结构体之内,名字重复可肯定是error。(未证实,可以做实验,而且可以把两处的宏定义成不同的值,会是什么情况?)
定义在结构体之内的宏在结构体内可以隐藏定义在结构体之外定义的宏,如果都在结构体之外定义,那么就是定义了两个相同的宏,而一个在内,一个在外,则结构体内只看到内部定义的宏,而结构体外只看到外部定义的宏,跟变量的隐藏类似。
宏的处理是在编译的预处理阶段完成的。预处理器根本就不认识什么结构体,在C语言编译器编译这个C文件中的结构体时,这个define语句已经不存在了。相应的,用到这个宏的地方,宏本身也已经替换成宏的值(这个宏展开)。大家可以用gcc -E命令来只做预处理而不编译,看看出来后的文件。
至于为什么在结构体里头#define,是因为这个宏一般用于定义该结构体里头的标志位变量的可能的值,和结构体的这个变量密切相关。放在一起从逻辑上比较容易理解。
今天看到一段代码,里面有个结构体的定义中还包含了常量的宏定义,以前没有见过,感觉很奇怪,不知道进行预处理时,预处理会做何处理,因此想请大家来看看,这样做有什么含义,为什么不把这些定义放在结构体定义的外部呢?
比如
typedef struct aaa
{
.....
#define STATUS_1 0X02
#define STATUS_2 0X04
#define STATUS_1 0X08
....
}
跟放在外面一样
不过这几个宏只在本结构体内使用,代码读起来比较方便
我开始也怀疑作用域的问题,看来这不成问题了!
综上:是否该宏定义与放在外部是等同的,编译预处理器同样在内存中为每一个定义存储一个常量,而程序中各个部分都能毫无分别的使用该定义呢?而这样写的目的只是在开发过程中便于程序员理解该定义的逻辑意义.
Top
回复人: jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!) ( ) 信誉:101 2005-10-13 9:30:51 得分: 0
也许把 没有很注意这个问题哦 自己也没有这样用过 呵呵
Top
回复人: lengxiao_wang() ( ) 信誉:100 2005-10-13 13:39:23 得分: 0
补充一下:宏的作用域的问题可以使用#undef/#endif 对定义即可。但是有一点你得注意,不能再函数体内定义宏。
Top
回复人: snowbirdfly(好好学习~好好动手~~~) ( ) 信誉:100 2005-10-13 14:16:28 得分: 0
个人感觉就是便于阅读程序,容易理解~~~
Top
回复人: DiabloWalkOnTheEarth(WorldOfWg( 狗城是个烂代理 )) ( ) 信誉:97 2005-10-13 14:32:29 得分: 0
谁说不能在函数体内定义宏, 只要喜欢, 什么地方定义宏根本就木关系. 宏本来就不是 语言的一部分, 预处理器也根本不会知道宏定义是在结构内还是结构外, 函数内还是函数外.
Top
回复人: bailingke(大钊) ( ) 信誉:100 2005-10-13 14:50:27 得分: 0
编译器根本不知道有什么宏,编译器单元中只有宏定义后面的数字,跟作用域有什么关系?
Top
回复人: zw_2046(悬崖) ( ) 信誉:100 2005-10-13 17:18:00 得分: 0
看来得回家动手试试才知道了哦!