打印

怎样使结构体在所有文件中都能用?

[复制链接]
5774|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飞絮飘飘|  楼主 | 2012-6-25 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32程序中,在main函数中定义的结构体或共同体,在其他函数中不能用,赋值时说没定义,怎么做才行?请高手指教。
沙发
john_lee| | 2012-6-25 10:55 | 只看该作者
定义到一个头文件中,C文件include这个头文件就行了。

使用特权

评论回复
板凳
飞絮飘飘|  楼主 | 2012-6-25 12:40 | 只看该作者
谢谢楼上,但可能不是这么简单,我在项目里添加一个h文件: MMM.h,定义一个结构体:

  
   struct  
    {
          unsigned SET        :1;  
          unsigned TIM3_OV    :1;
          unsigned U2RV       :1;
          unsigned SEC_C1     :1;  
          unsigned SEC_C2     :1;   
    }WORK;


在main函数中:#include "MMM.h"
在stm32f10x_it.c函数中也 #include "MMM.h"

之后写各一个测试语句:WORK.TIM3_OV =1;

编译后报错:.\output\SZY_96_LCD.axf: Error: L6200E: Symbol WORK multiply defined (by stm32f10x_it.o and main.o).
好像说我重复定义。

使用特权

评论回复
地板
amwrdfe| | 2012-6-25 12:43 | 只看该作者
哎,
#ifndef xxx
#define xxx
就是干这个用的,
这是c的基本功哦。

使用特权

评论回复
5
figo20042005| | 2012-6-25 12:52 | 只看该作者
结构体定义如3楼,条件编译就多了。#ifndef xxx #define xxx #endif  .#ifdef xxx #define xxx #endif
#if xxx  #define xxx  #elif xxx  #define xxx #endif

使用特权

评论回复
6
飞絮飘飘|  楼主 | 2012-6-25 14:39 | 只看该作者
4楼,#ifndef xxx  #define xxx 是怎么用的,索性说的详细点,权当给俺科普一下

使用特权

评论回复
7
amwrdfe| | 2012-6-25 15:53 | 只看该作者
字面理解就行了,
如果未定义xxx
定义xxx

多个文件包含时,
已经有文件定义了xxx,
就不会发生多次定义xxx这种事了

使用特权

评论回复
8
ilovezeno| | 2012-6-25 16:29 | 只看该作者
本帖最后由 ilovezeno 于 2012-6-25 16:34 编辑

lz 你在一个头文件里定义了一个变量,那么被各个c文件包含以后,自然出现了重复定义
你在头文件里需要的是声明变量,然后在唯一的一个c文件中定义变量。

c语言声明可以很多次,定义只能一次,明白不

C语言需要回炉再造阿。。。。

使用特权

评论回复
9
xwj| | 2012-6-25 16:32 | 只看该作者
LS 正解。

使用特权

评论回复
10
john_lee| | 2012-6-25 16:41 | 只看该作者
谢谢楼上,但可能不是这么简单,我在项目里添加一个h文件: MMM.h,定义一个结构体:

  
   struct  
    {
          unsigned SET        :1;  
          unsigned TIM3_OV    :1;
          unsigned U2RV       ...
飞絮飘飘 发表于 2012-6-25 12:40

哦,你要定义结构变量啊,最好不要在头文件中定义。
标准的方法:
在头文件中定义结构类型,在“某个”C文件中定义这个结构类型的“全局”变量,其它C文件声明这个结构类型的“外部”变量。

例如:

// 头文件----------
#ifndef __MMM_H
#define __MMM_H

typedef struct {
    ...
} work_t;   // 定义了 work_t 结构类型
#endif // __MMM_H

// C文件----------
#include "mmm.h"

work_t work;     // 定义 work_t 类型的全局变量 work。

......

// 其它C文件---------
#include "mmm.h"

extern work_t work;   // 声明 work_t 类型的外部变量 work。

......

或者如果你的 work 变量使用非常广泛,几乎在每个C文件中都会访问到,那么就可以在定义 work_t 结构类型的头文件中,直接声明其外部变量:

// 头文件----------
#ifndef __MMM_H
#define __MMM_H

typedef struct {
    ...
} work_t;   // 定义了 work_t 结构类型
extern work_t work;  // 声明 work_t 类型的外部变量 work。

#endif // __MMM_H

那么在其它C文件中就不必挨个声明外部变量了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dong_abc + 1
11
blowlow| | 2012-6-25 18:08 | 只看该作者
简单:
在一个C文件(不是头文件)里面定义变量,在其他C文件里面用extern来引用!!

使用特权

评论回复
12
abin0415| | 2012-6-25 20:41 | 只看该作者
李老师,正解。在.h文件里声明(typedef),在.c文件里定义,如果在其他文件里引用时,加extern声明。

使用特权

评论回复
13
figo20042005| | 2012-6-25 20:44 | 只看该作者
对,全局变量在一个文件里定义了,在另外的文件里定义要加extern

使用特权

评论回复
14
figo20042005| | 2012-6-25 20:46 | 只看该作者
对,全局变量在一个文件里定义了,在另外的文件里定义要加extern

使用特权

评论回复
15
飞絮飘飘|  楼主 | 2012-6-25 22:12 | 只看该作者
感动了,谢谢诸位,我的C语言的确有待提高,可惜最高只能给20分。

使用特权

评论回复
16
电子write_cai| | 2012-6-26 08:39 | 只看该作者
哦,你要定义结构变量啊,最好不要在头文件中定义。
标准的方法:
在头文件中定义结构类型,在“某个”C文件中定义这个结构类型的“全局”变量,其它C文件声明这个结构类型的“外部”变量。

例如:
// 头文件----- ...
john_lee 发表于 2012-6-25 16:41
讲的很透彻

使用特权

评论回复
17
caoxh1988| | 2012-6-26 08:47 | 只看该作者
学习了

使用特权

评论回复
18
hnlxy712| | 2012-6-26 09:06 | 只看该作者

使用特权

评论回复
19
hnlxy712| | 2012-6-26 09:07 | 只看该作者
使用条件编译ifndef xxx #define xxx #endif    好用

使用特权

评论回复
20
hnlxy712| | 2012-6-26 09:09 | 只看该作者
条件编译ifndef xxx #define xxx #endif  .#ifdef xxx #define xxx #endif

使用特权

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

本版积分规则

0

主题

20

帖子

0

粉丝