我从编译器收到一条错误消息,指示(它是嵌入式C编译器):

错误[P​​e020]:在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

我想在另一个 header 中使用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

最佳答案

好像是一个循环包括:enet_uip_ap01.h包括datahandler.h,而datahandler.h包括enet_uip_ap01.h。 (myflash.h也是如此)

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

  • datahandler.h将包含enet_uip_ap01.h(在定义MPTR之前),
  • enet_uip_ap01.h将包含datahandler.h,该操作不起作用,因为DATAHANDLER_H是在步骤(1)中定义的
  • enet_uip_ap01.h将尝试使用MPTR,但是未定义MPTR(将在enet_uip_ap01.h包含之后定义-在此包含中不可用)。

  • 一种可能的解决方案是使datahandler.h(和myflash.h)不包含enet_uip_ap01.h;如果他们需要enet_uip_ap01.h为您提供的内容,则必须专门包含该内容,前提是未在enet_uip_ap01.h中直接定义该内容。

    总结起来,您需要重构包含,以使“包含图”没有循环。

    关于c - Typedeffed结构未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8120928/

    10-12 23:23