Arduino IDE не распознает, что файл .c является .cpp

Я делаю библиотеку для конкретной платы для Arduino IDE. Библиотека отлично работает, и теперь я делаю шаг назад, чтобы добавить OO. Библиотека представляет собой смесь файлов .c и .cpp. Я знаю, что для добавления классов мне нужно использовать только .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, нужно ли установить флаг компилятора? Спасибо.


person Sara Chipps    schedule 14.11.2016    source источник


Ответы (2)


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

(Возможно, вам также потребуется добавить

#ifdef __cplusplus
extern "C" {
#endif

вверху и

#ifdef __cplusplus
}
#endif

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

person bwinton    schedule 14.11.2016
comment
Вам нужно будет сделать extern "C" как для объявления (он же прототип), так и для определения (если это необходимо, т.е. если ваш main.cpp объявляет что-то, что вызывает кто-то другой (чего обычно не должно). Сама функция main() не должна нужно, компилятор C++ знает, как это сделать неявно. - person uliwitness; 14.11.2016

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

#ifdef __cplusplus
class MyClass {
  // ...
};
#endif
person accumulator    schedule 14.11.2016
comment
Но тогда вы не сможете получить доступ к классу LED из main.c… - person bwinton; 14.11.2016
comment
Обычно в таких случаях люди пишут C-оболочку вокруг класса C++, которую можно вызывать из C. Т.е. просто структуры (без наследования или методов) и extern "C" функции. - person uliwitness; 14.11.2016
comment
Для тех, кому интересно, почему это проблема, в основном это касается модулей компиляции. Более подробное введение (которое не охватывает подробности C++) см. на masters- of-the-void.com/book10.htm - person uliwitness; 14.11.2016