2011-11-14 69 views
1

我從編譯器接收指示一個錯誤消息(它是一個嵌入式C編譯器):Typedeffed結構未定義雖然它被定義

錯誤[Pe020]:標識符「MPTR」在myflash.h是未定義的(見下面的代碼)

我正在使用稱爲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

你可以發佈你的'enet_uip_ap01.h'嗎?第二個頭文件中的struct _MPTR *是否工作? – Yuji

+0

目前粘貼的代碼不應該有任何問題,請發帖'enet_uip_ap01.h' – Avinash

+0

嘗試在這裏包括datahandler.h – Kris

回答

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包括 - 這是不是此內可用包括)。

一種可能的解決方案是使datahandler.h(和myflash.h)包括enet_uip_ap01.h;如果他們需要enet_uip_ap01.h給你的東西,他們必須特別包含那個東西,假設它沒有直接在enet_uip_ap01.h中定義。

總結一下,你需要重構你的包含,使「包含圖」沒有周期。

+1

檢測循環引用(儘管有時不可避免)應該觸發'rethink_my_design()'或至少是'rethink_my_code_organisation()'方法... ;-) – alk

+0

我正在這樣做:-) – JustGreg

+0

好吧,我已經只是清理了我的代碼,拆分了一些頭文件,做了單獨的包含,現在它運行良好。謝謝! – JustGreg

0

像Ambroz Bizjak說的,這可能是一個循環依賴問題。

在myflash.h,在函數聲明之前,將下面的一行:

typedef struct _MPTR MPTR; 

這樣,你聲明的類型,因此它可以在聲明中使用定義的結構之前。

+0

解決清潔我的代碼,但無論如何感謝! – JustGreg

相關問題