megaharon 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Здравствуйте. Ситуация такая: Есть желание использовать совместно в одном проекте scmRTOS и CMSIS для Cortex M3. scmRTOS написана на C++. Библиотека CMSIS написана на С. В этой библиотеке используются анонимные структуры, например: /*------------- General Purpose Input/Output (GPIO) --------------------------*/ /** @brief General Purpose Input/Output (GPIO) register structure definition */ typedef struct { union { __IO uint32_t FIODIR; struct { __IO uint16_t FIODIRL; __IO uint16_t FIODIRH; }; struct { __IO uint8_t FIODIR0; __IO uint8_t FIODIR1; __IO uint8_t FIODIR2; __IO uint8_t FIODIR3; }; }; ... } LPC_GPIO_TypeDef; Анонимные структуры запрещены в C++, при компиляции вылезает куча предупреждений: "warning: ISO C++ prohibits anonymous structs [-pedantic]". В исходниках CMSIS, конечно, есть развязки: #if defined ( __CC_ARM ) #pragma anon_unions #endif Но компилятор игнорирует прагму: "warning: ignoring #pragma anon_unions [-Wunknown-pragmas]". Как мне заставить проект компилироваться корректно, не меняя исходников CMSIS? Использую: Eclipse GCC toolchain от человека с ником Klen make от человека с ником АНТОХА scmRTOS (3.10) CMSIS (lpc1768 release 26 July 2010) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба В исходниках CMSIS, конечно, есть развязки: #if defined ( __CC_ARM ) #pragma anon_unions #endif Но компилятор игнорирует прагму: "warning: ignoring #pragma anon_unions [-Wunknown-pragmas]". Похоже, что эта pragma для другого компилятора. Видимо, придется подправить __CC_ARM и прагму под GCC. Для CMSIS сделать патч, и патчить при замене библиотеки на новую версию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Куча предупреждений вылезает из-за опции -pedantic компилятора (очень полезная опция, кстати). Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c Не, если makefile от человека с ником AHTOXA, то *.c файлы компилируются как си. Видимо там эти структуры в хидерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Да, анонимные структуры\объединения имеются в хедерах. Дело не в C++. У меня файлы компилятся в C с предупреждением warning: ISO C doesn't support unnamed structs/unions В опциях компилятора указал -std=gnu99 но предупреждение не ушло, хотя и не мешает, проект собирается нормально, но настораживает сам факт предупреждения. Я бы предпочёл, чтобы всё было чисто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Анонмные структуры вещь нестандартная. Поэтому, если компилятор проглатывает и правильно все интерпретирует, то уже надо радоваться, несмотря на warnings. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Радости мало, ибо когда проект большой и нужный хедер инклудится в сотню файлов, то репорт компилятора выходит на несколько страниц текста. И приходится же просматривать - не упустить бы чего серьёзного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megaharon 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба И приходится же просматривать - не упустить бы чего серьёзного. Верно. Сейчас поставил другой тулчейн -- codesourcery. Проект сделал тестовый (main.cpp), без scmRTOS, зато с CMSIS и анонимными структурами. В настройках проекта выставлено Language Standard = ISO C90 with GNU extensions. (C/C++Build -> Settings -> Miscellaneous) Предупреждений не возникает. Фрагмент консоли с компиляцией (не для себя, для искушенных): 'Building file: ../src/lpc17xx_gpio.c' 'Invoking: ARM Sourcery Windows GCC C Compiler' arm-none-eabi-gcc -O0 -Wall -Wa,-adhlns="src/lpc17xx_gpio.o.lst" -c -fmessage-length=0 -MMD -MP -MF"src/lpc17xx_gpio.d" -MT"src/lpc17xx_gpio.d" -mcpu=cortex-m3 -mthumb -o"src/lpc17xx_gpio.o" "../src/lpc17xx_gpio.c" 'Finished building: ../src/lpc17xx_gpio.c' ' ' Если же выставить ISO C99 (-std=c99), то возникает множество предупреждений на анонимные структуры: "Declaration does not declare anything" и еще возникают ошибки там, где к этим структурам обращается программа. Вот кусок консольного вывода: arm-none-eabi-gcc -O0 -Wall -std=c99 -Wa,-adhlns="src/lpc17xx_gpio.o.lst" -c -fmessage-length=0 -MMD -MP -MF"src/lpc17xx_gpio.d" -MT"src/lpc17xx_gpio.d" -mcpu=cortex-m3 -mthumb -o"src/lpc17xx_gpio.o" "../src/lpc17xx_gpio.c" In file included from ../src/lpc17xx_gpio.h:31:0, from ../src/lpc17xx_gpio.c:26: ../src/LPC17xx.h:200:6: warning: declaration does not declare anything Вобщем, должен быть способ отключить вывод избранных предупреждений. Не могу сообразить какой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 января, 2011 Опубликовано 19 января, 2011 · Жалоба Разобрался путём тшательного чтения документации на компилятор (arm-none-eabi-xxx от Code Sourcery). Оказывается, что опция -pedantic побуждает компилятор к строгому следованию стандарту несмотря на наличие опции -std=gnu99 которая подключает расширения gnu, коими и являются безымянные структуры\объединения. Убрав опцию -pedantic я исключил только предупреждения, касающиеся расширений, что мне и требовалось. Хотелось бы знать, не повлечёт ли это за собой неприятных последствий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megaharon 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Хотелось бы знать, не повлечёт ли это за собой неприятных последствий. Я думаю, что не должно. Но в своем проекте я не отключил pedantic, а таки отредактировал хедеры, добавив __extension__ перед проблемными структурами. По крайней мере, если буду обновлять библиотеку я получу заново эти варнинги, просмотрю код, добавлю __extension__ и буду уверен, что в других местах не появилось новых сюрпризов. codesourcery gcc.pdf, страницы 47, 48 -pedantic Выдает все предупреждения, которых требует стандарт ISO C и ISO C++; бракует программный код использующий запрещенные расширения или код, не соответствующий стандартам ISO C и ISO C++. Версия стандарта ISO C определяется опцией "-std". Код, полностью соответствующий стандартам ISO C и ISO C++, должен верно компилироваться как с опцией -pedantic так и без нее (хотя, за редким исключением, может потребоваться уточнение версии ISO C с помощью опций "-std" или "-ansi"). Однако, без этой опции, определенные особенности и расширения C и C++ поддерживаются, а с ней - нет. "-pedantic" не вызывает появление предупреждений при использовании альтернативных ключевых слов, начинающихся и оканчивающихся '__'. Предупреждения pedantic также отключены в выражениях, следующих после ключевого слова __extention__. Однако такой способ избежания предупреждений следует использовать исключительно в заголовочных файлах, и не использовать его непосредственно в коде программы. См. также Section 6.43 [Alternate Keywords], page 375. Некоторые пользователи пытаются с помощью -pedantic проверять программы на строгое соответствие ISO C. Но скоро они обнаруживают, что это не срабатывает именно так, как они хотят: -pedantic находит некоторые "не-ISO" приемы программирования, но не все - только те, для которых стандарт ISO C _требует_ диагностику и некоторые другие, диагностика которых была добавлена (ключами компилятора?). Функциональная возможность компилятора выдавать отчет о любых несоответствиях ISO C может быть полезна в некоторых случаях, но потребует большого количества дополнительной работы и будет совершенно отличаться от "-pedantic". Мы не планируем реализовывать такую возможность в ближайшем будущем. Там, где стандарт определенный опцией "-std" представляет собой расширенный диалект GNU языка C, такой как gnu90 или gnu99, существует соответствующий _базовый_стандарт_, версия ISO C на которой базируется расширение GNU. Предупреждения от pedantic выдаются пользователю в случаях, когда этого требует базовый стандарт. (Нет смысла в предупреждениях выдаваемых исключительно для особенностей находящихся вне этого определенного диалекта GNU C, поскольку он по определению включает в себя все особенности поддерживаемые компилятором с данной опцией, и беспокоиться не о чем). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться