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

[复制链接]
 楼主| 飞絮飘飘 发表于 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的基本功哦。
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
 楼主| 飞絮飘飘 发表于 2012-6-25 14:39 | 显示全部楼层
4楼,#ifndef xxx  #define xxx 是怎么用的,索性说的详细点,权当给俺科普一下
amwrdfe 发表于 2012-6-25 15:53 | 显示全部楼层
字面理解就行了,
如果未定义xxx
定义xxx

多个文件包含时,
已经有文件定义了xxx,
就不会发生多次定义xxx这种事了
ilovezeno 发表于 2012-6-25 16:29 | 显示全部楼层
本帖最后由 ilovezeno 于 2012-6-25 16:34 编辑

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

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

C语言需要回炉再造阿。。。。
xwj 发表于 2012-6-25 16:32 | 显示全部楼层
LS 正解。
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文件声明这个结构类型的“外部”变量。

例如:

  1. // 头文件----------
  2. #ifndef __MMM_H
  3. #define __MMM_H

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

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

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

  4. ......

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

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

  4. ......

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

  1. // 头文件----------
  2. #ifndef __MMM_H
  3. #define __MMM_H

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

  8. #endif // __MMM_H

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

评分

参与人数 1威望 +1 收起 理由
dong_abc + 1

查看全部评分

blowlow 发表于 2012-6-25 18:08 | 显示全部楼层
简单:
在一个C文件(不是头文件)里面定义变量,在其他C文件里面用extern来引用!!
abin0415 发表于 2012-6-25 20:41 | 显示全部楼层
李老师,正解。在.h文件里声明(typedef),在.c文件里定义,如果在其他文件里引用时,加extern声明。
figo20042005 发表于 2012-6-25 20:44 | 显示全部楼层
对,全局变量在一个文件里定义了,在另外的文件里定义要加extern
figo20042005 发表于 2012-6-25 20:46 | 显示全部楼层
对,全局变量在一个文件里定义了,在另外的文件里定义要加extern
 楼主| 飞絮飘飘 发表于 2012-6-25 22:12 | 显示全部楼层
感动了,谢谢诸位,我的C语言的确有待提高,可惜最高只能给20分。
电子write_cai 发表于 2012-6-26 08:39 | 显示全部楼层
哦,你要定义结构变量啊,最好不要在头文件中定义。
标准的方法:
在头文件中定义结构类型,在“某个”C文件中定义这个结构类型的“全局”变量,其它C文件声明这个结构类型的“外部”变量。

例如:
// 头文件----- ...
john_lee 发表于 2012-6-25 16:41
讲的很透彻
caoxh1988 发表于 2012-6-26 08:47 | 显示全部楼层
学习了
hnlxy712 发表于 2012-6-26 09:06 | 显示全部楼层
hnlxy712 发表于 2012-6-26 09:07 | 显示全部楼层
使用条件编译ifndef xxx #define xxx #endif    好用
hnlxy712 发表于 2012-6-26 09:09 | 显示全部楼层
条件编译ifndef xxx #define xxx #endif  .#ifdef xxx #define xxx #endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部