2016-11-14 6 views
15

Ich mache eine Bibliothek für eine bestimmte Platine für die Arduino IDE. Die Bibliothek funktioniert großartig und jetzt mache ich einen Schritt zurück, um OO hinzuzufügen. Die Bibliothek besteht aus einer Mischung aus C- und CPP-Dateien. Ich weiß, um Klassen hinzuzufügen, brauche ich nur .cpp.Arduino IDE nicht erkennen, dass .c-Datei ist .cpp

Dies ist die LED.h-Datei.

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

Hier ist die LED.cpp Datei.

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

Der Fehler, den ich bekommen ist:

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

Ich vermute, dass der Arduino die CPP-Datei als .c ist zu sehen, gibt es einen Compiler-Flag I gesetzt muss? Vielen Dank.

Antwort

7

So ist das Problem, dass der C-Compiler für main.c das Schlüsselwort "Klasse" in der C++ - Header-Datei LED.h nicht versteht. Können Sie main.c zu main.cpp ändern und sehen, ob das funktioniert?

(Sie müssen unter Umständen auch

#ifdef __cplusplus 
extern "C" { 
#endif 

an der Spitze, und

#ifdef __cplusplus 
} 
#endif 

am unteren Rand der main.h Datei (oder vielleicht die main.cpp Datei hinzufügen?), So dass C++ doesn‘ t versuchen, die Namen einiger Ihrer Funktionen zu ändern, damit der Linker sie finden kann ...

+0

Dies funktioniert, danke. –

+0

Sie müssen das 'externe 'C'' sowohl bei der Deklaration (als Prototyp) als auch bei der Definition (wenn es notwendig ist, dh wenn '' main.cpp' 'etwas deklariert, das jemand anders anruft) (was normalerweise nicht der Fall sein sollte)) Die main() - Funktion selbst sollte es nicht brauchen, der C++ - Compiler weiß das implizit. – uliwitness

2

Sie können keine C++ - Deklarationen in Headerdateien in C-Dateien einschließen o Mischen C und C++ Deklarationen in der gleichen Header-Datei, wickeln Sie die C++ Einsen in

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

Aber dann können Sie nicht auf die LED-Klasse von main.c zugreifen ... – bwinton

+0

Normalerweise, was Leute in solchen Fällen tun ist ein C-only-Wrapper um die C++ - Klasse, die von Ciele nur Strukturen (ohne Vererbung oder Methoden) und "extern" C-Funktionen aufgerufen werden kann. – uliwitness

+0

Für alle neugierig, warum dies ein Problem ist, ist es meist über _compilation units_. Für ein ausführlicheres Intro (das die Details von C++ nicht abdeckt), siehe http://masters-of-the-void.com/book10.htm – uliwitness

Verwandte Themen