打印

怎么外部引用结构体变量

[复制链接]
17081|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LLLLWWWW|  楼主 | 2010-2-8 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在A.C文件里面定义了一个结构体变量PRTDATA;
struct PRTDATA{
           unsigned char XXXX;
           unsigned int XXXX;
           ......;
};
struct PRTDATA PRTDATA1[10];
要在B.C文件里面对其进行调用,应该如何用extern?
我试了下,用extern struct PRTDATA PRTDATA1[10];出错!

相关帖子

沙发
twz8858877| | 2010-2-8 16:27 | 只看该作者
类似这样,先申明一个类型
typedef  union
{
                uint Uint_Data;
                uchar Uint_Byte[2];

}Uint_To_Uchar;
extern Uint_To_Uchar Uint_Uchar;

使用特权

评论回复
板凳
LLLLWWWW|  楼主 | 2010-2-8 16:35 | 只看该作者
您这个是定义的共用体,不是结构体,是不是一定要定义成共用体?用结构体不行吗?

使用特权

评论回复
地板
twz8858877| | 2010-2-8 16:43 | 只看该作者
定义结构体方式是一样的,就是先申明一个新的结构体类型,用这个类型去定义
typedef struct {
           unsigned char XXXX;
           unsigned int XXXX;
           ......;
}PRTDATA;
extern PRTDATA PRTDATA1[10];

使用特权

评论回复
5
原野之狼| | 2010-2-8 23:07 | 只看该作者
估计是在B.C中没有INCLUDE A.H

使用特权

评论回复
6
LLLLWWWW|  楼主 | 2010-2-9 09:24 | 只看该作者
还是不行,再想办法,年前要搞定的~拜托大家了!
谢谢!

使用特权

评论回复
7
computer00| | 2010-2-9 09:35 | 只看该作者
用如下方法:

A.c中的内容:

struct PRTDATA{
           unsigned char XXXX;
           unsigned int XXXX;
           ......;
};
struct PRTDATA PRTDATA1[10];



B.c中的内容:
struct PRTDATA{
           unsigned char XXXX;
           unsigned int XXXX;
           ......;
};
extern struct PRTDATA PRTDATA1[10];


如果你嫌写两遍
struct PRTDATA{
           unsigned char XXXX;
           unsigned int XXXX;
           ......;
};麻烦,那么把它放到a.h中,然后在a.c和b.c中分别#include "a.h"

使用特权

评论回复
8
LLLLWWWW|  楼主 | 2010-2-9 09:42 | 只看该作者
谢谢圈圈,可以编译过去了,但是编译后有个warning,说PRTDATA1重复定义了,
有没有问题?
还有个CH375的问题想咨询一下,不知道您用过没?

使用特权

评论回复
9
computer00| | 2010-2-9 09:51 | 只看该作者
没用过……
报重复定义可能是因为你在extern的时候,对它进行赋初值了吧,直接写成
extern struct PRTDATA PRTDATA1[10];
就好,或者有些编译器认为加在后面的10也会导致这个问题,试试
extern struct PRTDATA PRTDATA1[];

使用特权

评论回复
10
LLLLWWWW|  楼主 | 2010-2-9 10:38 | 只看该作者
我都试过了,还是有warning,算了,可以运行就行~谢谢您!
CH375是南京沁恒的USB1.1的驱动芯片,他们自己定做的,
我发现有时候不是很好用,有时候好,有时候又不好~

使用特权

评论回复
11
思考| | 2010-2-10 15:26 | 只看该作者
私有函数在点C文件中声明,函数返回值类型定义为STATIC
公有函数在点H文件中声明
私有常量在点C中定义;私有变量在点C 中定义并在前面加前缀STATIC.
公有常量和变量在点H文件中定义

使用特权

评论回复
12
冷漠| | 2010-2-10 17:00 | 只看该作者
本帖最后由 冷漠 于 2010-2-10 19:46 编辑

11楼说的是 TC / VC / BC还是 C++?  下面这个程序完全违背了你的规则,但是C51环境下是绝对正确的。

AAA.c
char  PRTDATA1[10];    // 公有变量在点H文件中定义?别人上哪找PRTDATA1去?
void  ch_outb( );       //公有函数在点H文件中声明?
     
char ch_outa( )        // 函数返回值定义为STATIC ?
{
return PRTDATA1[1]=0xaa;
}

void main()
{  
    PRTDATA1[0]=ch_outa();
  ch_outb();
}


BBB.c
extern  char  PRTDATA1[];

ch_outb( )
{
char  abc;    私有变量没加前缀STATIC 呀。

PRTDATA1[1]=0xbb;
abc=PRTDATA1[0];
}

请问 PRTDATA1,abc,ch_outb( ),ch_outa( ) 是公有还是私有?

PRTDATA1,ch_outb( ),若是公有,没有必要一定写在 .H 里吧。
ch_outa( ) 若是私有函数,返回值没有定义为STATIC 呀?
abc是私有变量,也没有定义前缀STATIC 呀。定义就麻烦了,就相当于多了一个全局变量了。堆栈就少了一点空间了。

所以,规则应说明应用环境。
就像下例:

DDD.c
main( )
{
char   arr[40];
.....
)

这里明明定义了40字节在51DATA 覆盖区(相当于全局变量区了),压缩了堆栈区,齐达内老师偏要教导咱菜鸟,“这不占内存,调用时它只是临时加载到堆栈,函数退出时,它最终会释放掉的。”
我在这用C51,齐老师在那讲PC机。而且一直“哎呀,你不懂.......多看书。”

使用特权

评论回复
13
jerkoh| | 2010-2-10 21:56 | 只看该作者
我习惯在一个全局的  .h 里面写
typedef struct
                     {
                       ....
                      }xxx;
  然后其他函数 都可以使用了 只需要包含下全局那个结构体头文件

使用特权

评论回复
14
hificwc| | 2012-3-27 12:05 | 只看该作者
学习:handshake

使用特权

评论回复
15
ouxueguo| | 2012-7-5 17:18 | 只看该作者
这个写法好用,谢谢,折磨了半天问题解决了 13# jerkoh

使用特权

评论回复
16
superlg| | 2012-8-15 14:13 | 只看该作者
我什么我在ICCAVR当中总是编译不行呢?

使用特权

评论回复
17
superlg| | 2012-8-15 14:20 | 只看该作者
总是提示重发定义

使用特权

评论回复
18
sfesdm| | 2012-8-15 20:09 | 只看该作者
把结构体的声明放在h文件里面,需要用到这个结构体的c文件则把结构体所在的头文件包含进去就行了

使用特权

评论回复
19
znmcu| | 2012-8-16 07:42 | 只看该作者
首先你要把结构体的定义放入.h文件里,这样才可以由多个.c来进行包含,让.c知道有这种数据类型的存在,然后就可以在.c中进行定义与声明了,extern就是声明,告诉编译器这个变量在其他.c中,这样才可以访问到。一般来说,模块化编程中每一个程序模块都有一个.c和一个.h,.h用于定义与声明,.c用于具体代码的实现。

使用特权

评论回复
20
zhaofy521| | 2012-8-16 08:38 | 只看该作者
出错是因为,在B里没有这个结构类型

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

450

帖子

2

粉丝