2016-11-14 42 views
15

Tworzę bibliotekę dla konkretnej planszy dla Arduino IDE. Biblioteka działa świetnie i teraz robię krok do tyłu, aby dodać OO. Biblioteka jest mieszanką plików .c i .cpp. Wiem, że aby dodać klasy, potrzebuję tylko użyć .cpp.Arduino IDE nie rozpoznaje, że plik .c to .cpp

To jest plik LED.h.

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

Oto plik LED.cpp.

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

Błąd pojawia się:

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). 

Zgaduję, że Arduino widzi plik .cpp jak .c, czy istnieje flag kompilatora muszę ustawić? Dziękuję Ci.

Odpowiedz

7

Problem polega na tym, że kompilator języka C dla main.c nie rozumie słowa kluczowego "klasa" w pliku nagłówkowym C++ LED.h. Czy możesz zmienić main.c na i sprawdzić, czy to działa?

(Można również dodać

#ifdef __cplusplus 
extern "C" { 
#endif 

na górze, a

#ifdef __cplusplus 
} 
#endif 

na dole pliku main.h (albo plik, main.cpp?) Tak, że C++ nie robi” t spróbuj zmienić nazwy niektórych funkcji, aby linker mógł je znaleźć ...

+0

To zadziałało, dziękuję. –

+0

Będziesz musiał wykonać "extern" C "" zarówno na deklaracji (aka prototyp), jak i definicji (jeśli jest to konieczne, tzn. Jeśli twój 'main.cpp' deklaruje cokolwiek, co ktoś inny nazywa (co zwykle nie powinno) Sama funkcja main() nie powinna jej potrzebować, kompilator C++ wie o tym pośrednio. – uliwitness

2

Nie można uwzględniać deklaracji C++ w plikach nagłówkowych w plikach C. Jeśli potrzebujesz o wymieszaj deklaracje C i C++ w tym samym pliku nagłówkowym, zawiń te C++ w

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

Ale wtedy nie będzie można uzyskać dostępu do klasy LED z main.c ... – bwinton

+0

Zwykle to, co ludzie robią w takich przypadkach jest napisem C-only wrapper wokół klasy C++, która może być wywołana z samych struktur CIe (bez dziedziczenia lub metod) i funkcji "extern" C "' . – uliwitness

+0

Dla każdego ciekawego, dlaczego jest to problem, dotyczy to głównie _Compilacji units_. Aby uzyskać bardziej szczegółowe wprowadzenie (które nie obejmuje szczegółów C++) zobacz http://masters-of-the-void.com/book10.htm – uliwitness