[讨论] 多文件结构体的声明和定义的一点总结

hsleung   2012-10-17 21:09 楼主
首先先定义一个结构体类型,假如是struct structep{…..},注意这是类型,structep这种类型,在哪里定义这是后话。
然后再说结构体变量(区分结构体类型和结构体变量)。
结构体变量跟普通变量一样,先在一个源文件中定义一个结构体变量(struct structep ep1),再在一个头文件中声明结构体变量(extern struct strucep ep1),其余需要引用这个结构体变量的源文件只要包含这个头文件就可以了。
似乎完事了,但是我们必须要看到一个问题,就是其余源文件虽然引用了声明(extern struct strucep ep1),但是他们不认识structep这种类型,这种structep类型其实就像int一样,关键这些源文件怎么知道structep是一个和int类似的类型呢。所以这些源文件中需要一个类型定义(struct structep{…..})。我们就可以把结构体的类型定义也放在那个头文件中,让源文件包含其即可,这里我想在链接的时候类型定义是不存在重复定义的吧(个人感觉)。
所以最后结构如下,一个源文件(a.c)中定义结构体变量(struct structep ep1),一个头文件(a.h)中定义这个结构体类型(struct structep{…..})以及声明那个结构体变量(extern struct strucep ep1),需要使用这个结构体变量的(包括a.c)包含这个这个头文件即可。
这只是个人总结,如有错误请大家指出~~~~

回复评论 (5)

总结起来,楼主的问题其实就很简单:

声明结构体的结构  和 定义结构体;

其实,一般的做法都是楼主后来说的那种方法。

在一个头文件里 声明 这个结构体的结构。

然后,在需要定义,声明引用 这个结构体的源文件,包含入 这个结构声明;

多处定义,必然是重定义,因为定义意味着分配内存行为,必然是会错误的。

那么,声明呢?
这个问题,我没有太大的把握,回头想想怎么确认一下。
不过,我的理解是。

声明,任何声明都一样,包括 引用声明,函数声明,结构体结构声明。
它们的用途,分两种:
1.它给一个源文件引入一个 标示符, 引用外部变量的声明,就属于这种。
它只是告诉这个源文件,在外部某处有一个可引用的变量叫这个名字,在链接时,它会把这个标识符引用到那个定义处的地址上去;
2.告诉这个声明下面的源码,这样一个标示符必要的接口信息。
函数声明,就是属于这种;
而结构体的结构声明实际上也类似。
只不过这里不是 接口信息,而是内部成员结构信息。

如楼主所说,如果没有这种声明,这个源文件是不可能知道它的结构,接口,从而在编译时没办法安排好相应的堆栈位置,操作。
那么,在链接时,就没法正确和外部的函数或者结构体变量衔接起来。
强者为尊,弱者,死无葬身之地
点赞  2012-10-18 00:09

回复 沙发 辛昕 的帖子

感谢大侠的意见,非常受教。大侠提到堆栈,我手上有一款16位单片机,存储器分为寄存器,EEPROM,RAM和FLASH。除去寄存器和EEPROM不说,FLASH用来存储程序,RAM用来存储数据。然后再说变量,变量有全局变量,局部变量和静态变量,我想知道他们具体存在哪里,我一直比较乱。比如局部变量,存在堆栈中,但是是怎么开辟出来的呢,就是说堆栈是存在于RAM里面,但是怎么区分出来的,单片机怎么知道这块就是堆栈的,是我自己进行地址分配出来的吗,谢谢
点赞  2012-10-19 19:10

回复 板凳 hsleung 的帖子

这个,你是用C开发的哦?
如果是这样,一般来说.....

堆栈不用我们管,除非你想....你想重新定义它的位置或者 改变它的大小?
这个有点高难度,我目前还没这么干过
强者为尊,弱者,死无葬身之地
点赞  2012-10-19 21:14

回复 板凳 hsleung 的帖子

至于你问的那些片区怎么分的。
这个,你可以找找,项目文件里有没有 .map一类的文件,这个文件记录了 变量,函数分别被存在什么区域。

至于他们代表的意思,那你要根据具体的片子来看了。

另外,堆栈也是,片子自动会设置一个起点,比如51的 SP。

这个一般来说我们不用太关心,真要关心了....我真没想到为什么要关心,......
强者为尊,弱者,死无葬身之地
点赞  2012-10-19 21:17

回复 5楼 辛昕 的帖子

明白了,非常感谢
点赞  2012-10-23 09:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复