Как правильно запустить встроенный проект IAR на C и C ++?

В настоящее время я работаю над встроенным проектом для stm32f3. В этом проекте я хочу использовать оба .cpp а также .c файлы:
Файлы C предназначены для файлов инициализации UART / I2C …, а файлы C ++ — для более объектно-ориентированного решения. Поэтому мне действительно нужно оставить их обоих.
Мой вопрос, как заставить это работать должным образом? Я видел несколько ответов в Интернете, но все это кажется мне очень запутанным.

У меня уже был проект с uart.c/h файлы внутри проекта C ++ (плата работала просто отлично), но, как я добавил i2c.c/h файлы к проекту, появилось много ошибок компоновки.

Пример = Error[Li005]: no definition for "I2C_StructInit" [referenced from C:\Users\IAR Embedded Workbench\STM32F3-Discovery_FW_V1.1.0\Project\I2C Interface CPU\Debug\Obj\i2c.o]

Если main быть C или C ++ файл?

Должен ли я использовать Language\Auto в настройках проекта или указать для каждого файла для компиляции в C или C ++?

Когда мне нужно использовать extern "C"?

Я использую IAR Embedded Workbench IDE.
Любые другие советы приветствуются.

0

Решение

Я не знаком с этой платформой, но проблемы кажутся довольно общими.

Если main быть C или C ++ файл?

C ++ был бы более безопасным выбором, потому что main относится к инициализации программы, а C ++ реализует динамическую инициализацию в отличие от C.

Когда мне нужно использовать extern "C"?

Это важно и является вероятным источником вашей проблемы. Тебе нужно extern "C" украшать каждое объявление, используемое в C ++, чье определение предоставлено в C.

Если ваши C заголовки отсутствуют extern "C"Вы можете в крайнем случае добавить это для них:

extern "C" {
#include "i2c.h"}

Положить #include Директива внутри чего-либо, как правило, очень плохая идея, но это относительно безопасно, потому что extern "C" {} не вводит новую вложенную декларативную область, кроме изменения связи объявлений, содержащихся внутри.

Как предполагает Mine, вы также можете изменить заголовочные файлы, чтобы они содержали extern "C" при компиляции в режиме C ++. Мой совет основан на идее, что изменение библиотеки является большим злом. По моему опыту, встроенные драйверы могут быть динамически сгенерированы для платформы, или в любом случае вы можете позже перейти на немного другую платформу. Вы должны использовать идиому в этом ответе для своих собственных заголовков, но лично я бы избегал редактирования i2c.h любой ценой.

3

Другие решения

В ваших .h файлах вы, вероятно, должны писать так:

#ifdef __cplusplus
extern "C" {
#endif

xxxxx // Your header file content

#ifdef __cplusplus
}
#endif

Затем вы можете без проблем включить такие файлы .h в код .c и .cpp.

Обратите внимание на хитрость: все эти функции не имеют декораций c ++, поэтому и c, и c ++ видят одинаковые имена функций.

3

О материалах IAR:

Language\Auto заставляет компилятор определять язык по расширению файла .c/.cpp, Имейте в виду, что IAR (по крайней мере, 5.4) поддерживает только подмножество C ++, и не все функции доступны.

Для всего остального вы спросили: см. Ответ Potatoswatters о extern а также main,

2
По вопросам рекламы [email protected]