Typedeffed结构虽然已定义,但未定义

时间:2011-11-14 11:31:15

标签: c header struct compiler-errors typedef

我收到编译器的错误消息,指出(它是一个嵌入式C编译器):

错误[Pe020]:myflash.h中未定义标识符“MPTR”(参见下面的代码)

我正在使用名为MPTR的typedeffed结构。代码是:

//datahandler.h
#ifndef DATAHANDLER_H
#define DATAHANDLER_H

#include "enet_uip_ap01.h"

typedef struct _MPTR {

unsigned int flash_start;
unsigned int flash_pagestart;

unsigned short rom_start;
unsigned short rom_nextrecord;
unsigned short rom_lastrecord;
} MPTR;

...etc

我想在另一个标头中使用MPTR参数转发声明一个函数:

//myflash.h
#ifndef MYFLASH_H
#define MYFLASH_H

#include "enet_uip_ap01.h"


unsigned char FLASH_StorePage(MPTR *mptr, unsigned short addr, unsigned int flag);

两个标题:“datahandler.h”和“myflash.h”都包含在“enet_uip_ap01.h”中。但是,上面的函数声明会引发编译错误。

很可能这是一个简单的基本C语言问题,我不知道这是一种耻辱,但我没有想法如何解决它。如果有人能指出我的错误,我会很高兴。谢谢!

编辑:在此处添加其他代码:

//enet_uip_ap01.h
#ifndef ENET_UIP_AP01_H
#define ENET_UIP_AP01_H

//....other not relevant includes here...
#include "datahandler.h"
#include "myflash.h"

#endif

2 个答案:

答案 0 :(得分:6)

看起来像循环包含:enet_uip_ap01.h包含datahandler.h,datahandler.h包含enet_uip_ap01.h。 (同样适用于myflash.h)

假设源文件只包含datahandler.h:

  1. datahandler.h将包含enet_uip_ap01.h(在定义MPTR之前),
  2. enet_uip_ap01.h将包含datahandler.h,它不执行任何操作,因为DATAHANDLER_H是在步骤(1)中定义的,
  3. enet_uip_ap01.h将尝试使用MPTR,但未定义MPTR(将在 enet_uip_ap01.h包含后定义 - 此可用于此包含)。
  4. 一种可能的解决方案是使datahandler.h(和myflash.h)包括enet_uip_ap01.h;如果他们需要enet_uip_ap01.h给你的东西,他们必须具体包括那个东西,假设它没有直接在enet_uip_ap01.h中定义。

    总结一下,你需要重构你的包含,使“包含图”没有周期。

答案 1 :(得分:0)

像Ambroz Bizjak所说,这可能是一个循环依赖问题。

在myflash.h中,在函数声明之前,放置以下行:

typedef struct _MPTR MPTR;

这样就可以声明类型,以便在定义结构之前在声明中使用它。