В настоящее время я работаю над встроенным проектом для 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.
Любые другие советы приветствуются.
Я не знаком с этой платформой, но проблемы кажутся довольно общими.
Если
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
любой ценой.
В ваших .h файлах вы, вероятно, должны писать так:
#ifdef __cplusplus
extern "C" {
#endif
xxxxx // Your header file content
#ifdef __cplusplus
}
#endif
Затем вы можете без проблем включить такие файлы .h в код .c и .cpp.
Обратите внимание на хитрость: все эти функции не имеют декораций c ++, поэтому и c, и c ++ видят одинаковые имена функций.
О материалах IAR:
Language\Auto
заставляет компилятор определять язык по расширению файла .c/.cpp
, Имейте в виду, что IAR (по крайней мере, 5.4) поддерживает только подмножество C ++, и не все функции доступны.
Для всего остального вы спросили: см. Ответ Potatoswatters о extern
а также main
,