在结构体内定义宏
2012-11-09 21:20
176 查看
关于宏的作用域
1. 宏没有可见域。
如果说有,那就是从本文件(包括被包含的文件)中,该宏定义处开始,至文件的尾部或取消宏(#undef)为止。
2. 考虑一种特殊情况:
一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义名字重复了最多是编译警告。可是如果不在结构体之内,名字重复可肯定是error。(未证实,可以做实验,而且可以把两处的宏定义成不同的值,会是什么情况?)
定义在结构体之内的宏在结构体内可以隐藏定义在结构体之外定义的宏,如果都在结构体之外定义,那么就是定义了两个相同的宏,而一个在内,一个在外,则结构体内只看到内部定义的宏,而结构体外只看到外部定义的宏,跟变量的隐藏类似。
宏的处理是在编译的预处理阶段完成的。预处理器根本就不认识什么结构体,在C语言编译器编译这个C文件中的结构体时,这个define语句已经不存在了。相应的,用到这个宏的地方,宏本身也已经替换成宏的值(这个宏展开)。大家可以用gcc -E命令来只做预处理而不编译,看看出来后的文件。
至于为什么在结构体里头#deifne,是因为这个宏一般用于定义该结构体里头的标志位变量的可能的值,和结构体的这个变量密切相关。放在一起从逻辑上比较容易理解。
1. 宏没有可见域。
如果说有,那就是从本文件(包括被包含的文件)中,该宏定义处开始,至文件的尾部或取消宏(#undef)为止。
2. 考虑一种特殊情况:
一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义名字重复了最多是编译警告。可是如果不在结构体之内,名字重复可肯定是error。(未证实,可以做实验,而且可以把两处的宏定义成不同的值,会是什么情况?)
定义在结构体之内的宏在结构体内可以隐藏定义在结构体之外定义的宏,如果都在结构体之外定义,那么就是定义了两个相同的宏,而一个在内,一个在外,则结构体内只看到内部定义的宏,而结构体外只看到外部定义的宏,跟变量的隐藏类似。
宏的处理是在编译的预处理阶段完成的。预处理器根本就不认识什么结构体,在C语言编译器编译这个C文件中的结构体时,这个define语句已经不存在了。相应的,用到这个宏的地方,宏本身也已经替换成宏的值(这个宏展开)。大家可以用gcc -E命令来只做预处理而不编译,看看出来后的文件。
至于为什么在结构体里头#deifne,是因为这个宏一般用于定义该结构体里头的标志位变量的可能的值,和结构体的这个变量密切相关。放在一起从逻辑上比较容易理解。
相关文章推荐
- 在结构体内定义字符指针
- 重载结构体内<号 定义结构体大小比较
- 在结构体内定义宏
- 宏定义求结构体内变量偏移
- linux c 结构中定义结构
- 结构类型的定义,应用
- (2011.10.19)3_a1.cpp -- 顺序栈结构的定义
- 小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)
- 循环结构 函数的定义
- 二叉树的定义、存储结构、树的遍历
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- pthread_t结构的定义
- 结构题直接定义赋值语句
- ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。
- bs_t结构及其相关函数的定义
- 数据结构1.预定义类型和变量
- 数据结构--二叉树(定义与存储结构)
- 10002---div+css布局教程之div+css常见布局结构定义
- 4.6 指定用户定义层次结构中属性之间的属性关系
- MTK HTTP 协议之数据结构及枚举定义