2016-11-14 1 views
15

Я делаю библиотеку для конкретной платы для Arduino IDE. Библиотека отлично работает, и теперь я делаю шаг назад, чтобы добавить OO. Библиотека представляет собой сочетание файлов .c и .cpp. Я знаю, что для добавления классов мне нужно использовать только .cpp.Arduino IDE не признает, что .c файл .cpp

Это файл LED.h.

https://gist.github.com/SaraJo/182220fda82cbe30255fe95f59d4a6b4

Вот файл LED.cpp.

https://gist.github.com/SaraJo/1b3d6967d7bc2ef2e70d79025b755eb9

Ошибки я получаю:

In file included from /Users/sarachipps/Library/Arduino15/packages/Jewelbots/hardware/nRF51822/1.0.0/cores/JWB_nRF51822/Arduino.h:54:0, 
       from /Users/sarachipps/Library/Arduino15/packages/Jewelbots/hardware/nRF51822/1.0.0/cores/JWB_nRF51822/ble-nrf51822-master/source/main.c:49: 
/Users/sarachipps/Library/Arduino15/packages/Jewelbots/hardware/nRF51822/1.0.0/cores/JWB_nRF51822/LED.h:12:1: error: unknown type name 'class' 
class LED { 
^ 
/Users/sarachipps/Library/Arduino15/packages/Jewelbots/hardware/nRF51822/1.0.0/cores/JWB_nRF51822/LED.h:12:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token 
class LED { 
     ^
exit status 1 
Error compiling for board JWB nRF51822(V1.0 32KB). 

Я предполагаю, что Arduino видит файл .cpp, как .c, есть флаг компилятора мне нужно установить? Спасибо.

ответ

7

Итак, проблема заключается в том, что компилятор C для main.c не понимает ключевое слово «class» в заголовочном файле C++ LED.h. Можете ли вы изменить main.c на main.cpp и посмотреть, работает ли это?

(Вы можете также необходимо добавить

#ifdef __cplusplus 
extern "C" { 
#endif 

в верхней части, и

#ifdef __cplusplus 
} 
#endif 

в нижней части файла main.h (или, возможно, main.cpp файл?), Так что C++ Безразлично» t попытаться изменить имена некоторых ваших функций, чтобы линкер мог их найти ...

+0

Это сработало, спасибо. –

+0

Вам нужно будет сделать «extern» C «' как для декларации (как прототипа), так и для определения (если это необходимо, т.е. если ваш 'main.cpp' объявляет все, что вызывает кто-то другой (что обычно не должно). Сама функция main() не нуждается в ней, компилятор C++ знает, что делать это неявно. – uliwitness

2

Вы не можете включать объявления C++ в файлы заголовков в файлах C. Если вам нужно t o смешать объявления C и C++ в том же заголовочном файле, обернуть C++ в

#ifdef __cplusplus 
class MyClass { 
    // ... 
}; 
#endif 
+2

Но тогда вы не сможете получить доступ к классу LED из main.c ... – bwinton

+0

Обычно, что люди делают в таких случаях пишет C-only оболочку вокруг класса C++, которая может быть вызвана из CIe просто структур (без наследования или методов) и 'extern 'C' '. – uliwitness

+0

Для всех, кто интересуется, почему это проблема, в основном это _compilation units_. Более подробное введение (которое не охватывает детали C++, хотя) см. Http://masters-of-the-void.com/book10.htm – uliwitness

Смежные вопросы