Typedeffed структура не определена, хотя она определена - PullRequest
1 голос
/ 14 ноября 2011

Я получаю сообщение об ошибке от компилятора, указывающее (это встроенный компилятор C):

Ошибка [Pe020]: идентификатор «MPTR» не определен в myflash.h (см. Код ниже)

Я использую структуру с определением типа MPTR. Код:

//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». Однако приведенное выше объявление функции вызывает ошибку компиляции.

Скорее всего, это простая базовая проблема языка Си, и это позор, которого я не знаю, но у меня нет идей, как ее решить. Я был бы очень рад, если бы кто-то мог указать мне на мою ошибку. Спасибо!

РЕДАКТИРОВАТЬ: поместите дополнительный код здесь:

//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 ]

6 голосов
/ 14 ноября 2011

Похоже на циркулярное включение: 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) не include enet_uip_ap01.h;если им нужно что-то, что дает enet_uip_ap01.h, они должны специально включить эту вещь, предполагая, что это не определено напрямую в enet_uip_ap01.h.

Чтобы подвести итог, вам необходимо провести рефакторинг ваших включений таким образом, чтобы«включает график» не имеет циклов.

0 голосов
/ 14 ноября 2011

Как говорит Амброз Бизжак, это, вероятно, проблема циклической зависимости.

В myflash.h перед объявлением функции поместите следующую строку:

typedef struct _MPTR MPTR;

Таким образом, вы объявляететип, чтобы его можно было использовать в объявлениях до определения структуры.

...