Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка "[Error Pe070] incomplet type is not allowed"
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
mempfis_
Всем добрый день.
Пытаюсь добавить поддержку DHCP в проект Simple Webserver из IAR.
Скопировал файлы dhcpc.h и dhcp.c и файл dhcp.c добавил к проекту.
При компиляции IAR ругается на строки, где используется структура struct uip_eth_addr которая определена в файле uip.h как
Код
/**
* Representation of a 48-bit Ethernet address.
*/
struct  uip_eth_addr{
  u8_t addr[6];
};


Например кусок кода
Код
#ifndef __UIP_ARP_H__
#define __UIP_ARP_H__

#include "uip.h"

#if UIP_FIXEDETHADDR
extern const struct uip_eth_addr uip_ethaddr;
#else
extern struct uip_eth_addr uip_ethaddr;
#endif


/**
* The Ethernet header.
*/
struct uip_eth_hdr {
  struct uip_eth_addr dest; //Error[Pe070] incomplet type is not allowed
  struct uip_eth_addr src; //Error[Pe070] incomplet type is not allowed
  u16_t type;
};
#endif //__UIP_ARP_H__



В этом куске кода файл uip.h подключён директивой #include.
Т.е. теоретически код ниже должен свободно понимать что такое struct uip_eth_addr.
Практически выдаётся ошибка Pe070.
В чём я не прав? Или что я упускаю из виду?

Прилагаю также проект в IAR ARM 5.40
seneka
Наверное Вам нужно объявить в include файле тип структуры операторм typedef
mempfis_
Цитата(seneka @ Mar 24 2014, 13:28) *
Наверное Вам нужно объявить в include файле тип структуры операторм typedef


Это не помогает - я уже пробовал.
Если непосредственно перед struct uip_eth_hdr объявить структуру struct uip_eth_addr, ошибка пропадает.


Код
/**
* Representation of a 48-bit Ethernet address.
*/
struct  uip_eth_addr{
  u8_t addr[6];
};

/**
* The Ethernet header.
*/
struct uip_eth_hdr {
  struct uip_eth_addr dest;
  struct uip_eth_addr src;
  u16_t type;
};


Если же оставить описание структуры struct uip_eth_addr в другом h-файле и использовать подключение этого файла с текущему h-файлу, тогда появляется.

Если структура struct uip_eth_addr описана в файле uip.h, которые подключается в файле uip_arp_.h, в котором она используется для описания структуры uip_eth_hdr, то у меня есть предположение, что если гдето в другом месте проекта uip.h уже был подключён, то в файле uip_arp.h подключение не сработает из-за директив #ifndef __UIP_H__ #define __UIP_H__ #endif //__UIP_H__, поэтому IAR и ругается.

Правда я проверил все подключения uip.h в проекте, но нигде криминала не нашёл. В основном они подключаются в c-файлах, добавленных к проекту, а также в h-файлах uip_arp.h, httpd-fsdata.h, uip_arch.h. Причём если закоментировать подключение uip.h в uip_arch.h, то новых ошибок не появляется.

Я пока что затрудняюсь найти ответ на решение моей проблемы.
seneka
Вы только что описали причину проблемы "видимость". Посмотрел бегло заголовок uip.h там очень много #if или #ifdef
Скорее всего кто то из них делает Вашу структуру невидимой. Попробуйте поместить структуру в самый верх uip.h
mempfis_
Цитата(seneka @ Mar 24 2014, 14:04) *
Вы только что описали причину проблемы "видимость". Посмотрел бегло заголовок uip.h там очень много #if или #ifdef
Скорее всего кто то из них делает Вашу структуру невидимой. Попробуйте поместить структуру в самый верх uip.h


Ошибка всёравно остаётся даже если перенести описание структуры в самое начало файла uip.h.
Но она однозначно связана с видимостью определения. Если изменить название структуры uip_eth_addr, то ошибка остаётся всё той же.
В файле uip_arp.h не подключается файл uip.h. Попробую покопаться в проекте и разобраться почему так происходит.
jcxz
Сделайте вывод препроцессора в листинг и посмотрите, что туда включается (какие определения/объявления).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.