struct结构里的#define定义

关于宏的作用域

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

看来得回家动手试试才知道了哦!


相关文章

  • 二叉树的中序的递归.非递归遍历算法
  • 信息工程学院<数据结构> 课程设计报告 设计题目 二叉树的中序的递归.非递归遍历算法 专 业 班 级 小 组 成 员 一. 题目:二叉树的中序的递归.非递归遍历算法 二. 小组任务分工 马凯:编写二叉树中序递归遍历.非递归遍历 ...查看


  • 数据结构考试题
  • 1.已知线性表A,B,C 是递增有序的线性表.要求对A 表作如下运算:删去那些既在B 表 中出现又在C 表中出现的元素.A,B,C 以顺序表存储. #include #include #define maxsize 100 typedef ...查看


  • 栈和队列的基本操作的实现 数据结构实验
  • May 7 实验报告 2015 数据结构 第二次实验 姓名:陈斌 学号:E11314079 专业:13计算机科学与技术 学号E11314079专业计算机科学与技术姓名陈斌 实验日期 2015.05.07教师签字成绩 实验报告 [实验名称]栈 ...查看


  • Linux input子系统分析
  • 概述与数据结构 Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互.输入设备一般包括键盘,鼠标,触摸屏等,在内核中都是以输入设备出现的.下面分析inp ...查看


  • 用C语言开发小型数据库管理系统
  • 综合性程序设计试验 实验名称: 用C语言开发小型数据库管理系统 [目的] 1.利用所学的三种程序基本结构以及数组.指针.结构体.用户自定义函数.文件进行一个中型程序的设计,进一步理解和掌握C语言的语法以及三种基本程序结构的综合应用. 2.通 ...查看


  • 数据结构图的建立与输出课程设计
  • 计算机工程学院 数据结构课程 设计报告 题 目: 图的建立与输出 姓 名: 学 号: 专业班级: 指导教师: 设计时间: 目录 1 课题任务与计划„„„„„„„„„„„„„„„3 2 设计方案及原理„„„„„„„„„„„„„„„3 2.1 ...查看


  • 数据结构实验
  • 1. 编程实现在顺序存储的有序表中插入一个元素(数据类型为整型). #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 ...查看


  • 中缀表达式求值实验报告
  • 中缀表达式求值实验报告 一.需求分析(要实现的功能描述) 1.问题描述: 在计算机中,算术表达式由常量.变量.运算符和括号组成.由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行.因而在程序设计时 ...查看


  • C#程序设计简介英文技术资料翻译中文
  • 英文原文: C# Program Design C# introduction C# (pronounced "See Sharp") is a simple, modern, object-oriented, and ...查看


热门内容