打印
[STM32F1]

C语言的.h文件中结构体引用的问题。

[复制链接]
4038|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
深夜星空|  楼主 | 2014-6-18 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 深夜星空 于 2014-6-19 10:12 编辑

各位大神:
        用STM32,模块太多,分了几个文件,结果发现管理起来真是挺难啊。原谅我C语言没学好 - -。新问题:
void send(Mechine* M)
{
  if(M==&M1)
    MechineNum=1;              
if(*M==M2)
    MechineNum=2;
}
这两种引用,第二种红色的报错,为什么?

现在问题是:
在 a.h 中定义了一个结构体,声明两个变量,方便引用。
typedef struct
{
  u16   Temperature;
  u16   Humidity;
}Mechine;

extern Mechine M1,M2;

在 a.c 中定义两个变量:
Mechine M1,M2;

现在 b.h 中声明一个函数,用刚才定义的结构体类型的变量作为参数
void  send( Mechine* M )

在 b.c 中的实现函数
#include "a.h"
#include "b.h"
void  send( Mechine* M )
{}

结果,报错说 b.h 函数的参数 结构体找不到。红色标出。不明原因,请大神帮帮忙看一下。先谢

111问题解决了,我把这个 函数 void  send( Mechine* M ) 拿出来 单做了一个.c 一个.h文件,再去 #include "a.h" 又好了。
我一直觉得是编译器编译顺序问题,如果先#include "a.h" (有结构体声明的文件) 再去#include "b.h" (有函数参数的文件)就应该不会出错,
我开始包含的顺序是按照这么做的,可还是报错。我用的IAR 6.5。不知道是不是这问题?

又在新的文件里试了一下,应该就是顺序的问题,顺序对,编译就不会出错。不知道刚才那个文件为什么不行。










沙发
ztl665205| | 2014-6-18 21:01 | 只看该作者
extern Mechine M1,M2;有放在b.c中?

使用特权

评论回复
板凳
airwill| | 2014-6-18 21:29 | 只看该作者
b.h 中加
#include "a.h"
就可以了.
注意学习一下防止重复包含的
#ifndef xxxx
#define xxxx
这个方法.

使用特权

评论回复
地板
深夜星空|  楼主 | 2014-6-18 22:54 | 只看该作者
ztl665205 发表于 2014-6-18 21:01
extern Mechine M1,M2;有放在b.c中?

放在了 a.h 中了

使用特权

评论回复
5
深夜星空|  楼主 | 2014-6-18 23:01 | 只看该作者
airwill 发表于 2014-6-18 21:29
b.h 中加
#include "a.h"
就可以了.

试了出错,Error[Pe256]: invalid redeclaration of type name "Mechine" (declared at line 25)  
另外,#ifndef xxxx
      #define xxxx
我也想用这个,一值不知道应该怎么用,还有 #ifdefine debug 什么的,用于调试的,我只知道是预处理命令,大概意思明白,就是不会用,版主能说具体点吗?

使用特权

评论回复
6
airwill| | 2014-6-19 06:25 | 只看该作者
这个错误就是重复包含引起的重复定义问题了. 举例吧
在 a.h 中头上加
#ifndef _INC_A_H
#define _INC_A_H

最后加
#endif
就可以了

使用特权

评论回复
7
深夜星空|  楼主 | 2014-6-19 10:01 | 只看该作者
airwill 发表于 2014-6-19 06:25
这个错误就是重复包含引起的重复定义问题了. 举例吧
在 a.h 中头上加
#ifndef _INC_A_H

明白了 多谢版主

使用特权

评论回复
8
深夜星空|  楼主 | 2014-6-19 10:12 | 只看该作者
顶顶顶,又有新问题了。 TT

使用特权

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

本版积分规则

31

主题

345

帖子

3

粉丝