mempfis_ 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Всем добрый день. Пытаюсь добавить поддержку 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 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Наверное Вам нужно объявить в include файле тип структуры операторм typedef Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Наверное Вам нужно объявить в 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 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Вы только что описали причину проблемы "видимость". Посмотрел бегло заголовок uip.h там очень много #if или #ifdef Скорее всего кто то из них делает Вашу структуру невидимой. Попробуйте поместить структуру в самый верх uip.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Вы только что описали причину проблемы "видимость". Посмотрел бегло заголовок uip.h там очень много #if или #ifdef Скорее всего кто то из них делает Вашу структуру невидимой. Попробуйте поместить структуру в самый верх uip.h Ошибка всёравно остаётся даже если перенести описание структуры в самое начало файла uip.h. Но она однозначно связана с видимостью определения. Если изменить название структуры uip_eth_addr, то ошибка остаётся всё той же. В файле uip_arp.h не подключается файл uip.h. Попробую покопаться в проекте и разобраться почему так происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 25 марта, 2014 Опубликовано 25 марта, 2014 · Жалоба Сделайте вывод препроцессора в листинг и посмотрите, что туда включается (какие определения/объявления). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться