struct 中的宏定义--没有作用域,只是为了逻辑上理解,和放在外部是一样的
来源:互联网 发布:学java的条件 编辑:程序博客网 时间:2024/06/06 04:59
关于宏的作用域
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
.... }
跟放在外面一样
不过这几个宏只在本结构体内使用,代码读起来比较方便
我开始也怀疑作用域的问题,看来这不成问题了!
综上:是否该宏定义与放在外部是等同的,编译预处理器同样在内存中为每一个定义存储一个常量,而程序中各个部分都能毫无分别的使用该定义呢?而这样写的目的只是在开发过程中便于程序员理解该定义的逻辑意义.
0 0
- struct 中的宏定义--没有作用域,只是为了逻辑上理解,和放在外部是一样的
- C++中作用域和定义在类外部的成员
- inline函数定义放在头文件中的作用
- scope 对象在 AngularJS 中充当数据模型的作用,也就是一般 MVC 框架中 Model 得角色.但又不完全与通常意义上的数据模型一样,因为 $scope 并不处理和操作数据,它只是建立了
- xml(在内部定义,上一篇是在外部引入)
- passive-interface 在eigrp 和 rip 中的作用一样吗?
- sizeof作用在struct和union上的情况,经典解答
- C++类模板中的友元函数的声明和定义分别放在哪里
- 【浅析】把实现放在头文件中的函数模板,为什么没有发生重定义错误
- 关于##在C宏定义中的作用
- 关于在适配器中更新ui的方法(写这个东西只是为了自己理解,不要看,大家看不懂)
- 【PreparedStatement的setObject的作用和setString的作用是一样的!】
- 【PreparedStatement的setObject的作用和setString的作用是一样的!】
- 【PreparedStatement的setObject的作用和setString的作用是一样的!】
- 使用typedef定义struct的作用
- tableviewcell 上放一个和cell 大小一样的button ,拦截了cell点击事件!!
- typedef定义的struct类型与struct定义的结构体变量在使用上的区别
- 这不只是为了一群牛,这是为了我们的自由
- Socket Http Tcp/ip的区别
- Rust - Arrays and Vectors | 数组和向量
- volatile代码中的应用
- 【数据结构系列】堆与堆排序
- 视图控制器ViewController的生命周期
- struct 中的宏定义--没有作用域,只是为了逻辑上理解,和放在外部是一样的
- netbean的安装及jdk安装和环境变量设置
- 十进制转二进制、十六进制
- 【1】基于TQ2440的MP3设计——【6、构建根文件系统】
- Android开发笔记——从SD卡保存和读取文件
- centos yum源使用整理以及安装国内yum源
- Android 中涉及的设计模式
- POJ 1236 Network of Schools(强连通分量缩点)
- ajax