Header einer Cpp-Datei einbinden

#4972975
Lesenswert?

Hallo,

ich programmiere den STM32F103C6T8 mit Eclipse(OpenSTM) in Cpp.

Nun habe ich ein Cpp-Projekt erstellt und möchte in der Datei 
"stm32f10x_conf.h" eine Cpp-Header-Datei einbinden, z.B. "debug.hpp".

Nun bekomme ich Compilerfehler wie z.B. unknown type bool, unknown type 
class, usw... Die typischen Fehler wenn man versucht in C Cpp 
einzubinden halt.

Wenn ich aber debug.hpp erst in main.cpp einbinde funktioniert alles wie 
erwartet.

Wie kriege ich die debug.hpp Datei schon  in stm32f10x_conf.h 
eingebunden?

Gruß
#4972979
Lesenswert?

Versuche mal die stm32f10x_conf.h in .hpp umzubenennen.
Alternativ kannst du evtl. im Makefile explizit g++ verwenden anstatt 
gcc (bzw. es gibt sicher auch ein Flag welches C++ ankündigt).

Ich vermute, dass der Compiler beim lesen der stm32f10x_conf.h von C 
anstatt C++ ausgeht und dementsprechend auch dann deine debug.hpp als C 
behandelt
Gast #4973117
Lesenswert?

Du glaubst ernsthaft, dass da mitten im Übe setzen von C zu C++ und 
zurück gesprungen wird? Nene, er übersetzt C++, auch wenn die Datei .h 
heißt.

Die ist nur offenbar kaputt. Wenn darin bool verwendet wird, muss der 
Header halt stdbool selbst einbinden.
#4973305
Lesenswert?

Oliver S. schrieb:
> unknown type
>> class

... ein C++-Compiler, der diese Fehlermeldung ausspuckt, ist keiner 
(sondern sehr wahrscheinlich eben ein C-Compiler, Ada wird's ja wohl 
nicht sein).

Also wirst Du wohl herausfinden müssen, warum deine IDE (Makefile, 
Compile-Script, was auch immer Du da benutzt) die Übersetzungseinheit, 
die das betreffende File includiert, mit dem C- anstatt dem C++-Compiler 
verwurstet.
Gast #4973415
Lesenswert?

Die inkludierten Dateien werden nicht für sich alleine übersetzt. 
Vermutlich gibt es in Deinem Projekt eine C-Datei, die stm32f10x_conf.h 
inkludiert. Das könnte zum Beispiel Startup-Code sein, der standardmäßig 
in ein neues Projekt eingefügt wird. Aus den Fehlermeldungen des 
Compilers sollte hervorgehen, welche C/CPP-Datei er gerade übersetzt.

Du könntest diese Datei dann von ".c" nach ".cpp" umbenennen, damit sie 
vom C++-Compiler statt vom C-Compiler übersetzt wird.

Besser wärs aber, die mitgelieferten Dateien vom Hersteller nicht 
anzufassen, sondern eine eigene "main.h" o.ä. zu definieren, die Du in 
Deinen eigenen Code einbindest. Ansonsten machst Du Dir unnötige 
Probleme, wenn Du z.B. mal die Toolchain updaten oder das Projekt auf 
einen anderen Controller portieren möchtest.
#4974052
Lesenswert?

Leider bin ich kein Informatiker und habe nur graue Vorahnung von was 
Ihr redet. Sorry.

Ja, die stm32f10x_conf.h wird in vielen anderen Headern eingebunden, 
aber in keiner c Datei. Nur mein startup code besteht als letzte 
Fehlerquelle. Diesen verstehe ich eh nicht und bin froh, dass er das tut 
was er soll. Er ist dem Anhang beigefügt. Bestimmt findet Ihr die 
betreffende Zeile...

Grund für das ganze:
ich möchte in den ISRs Cpp verwenden. Ja ich muss die stm32f10x_it.c 
noch in .cpp abändern. Aber erstmal will ich nur mal erfolgreich 
includieren.

Die Idee mit den Flags, da bin ich etwas unbeholfen.

Ich pack mal das ganze, noch sinnfreie, Projekt in den Anhang.
Wie Ihr sehen werdet, bin ich bis jetzt immer einen Umweg beim 
includieren gegangen. Eine c-Datei erstellt mit den Variablen für die 
ISR, dann erst eine Cpp-Datei um diese zu verarbeiten. z.B. bei i2c.c 
und I2Cdev.cpp

Danke für die vielen Antworten

Gruß
Angehängte Dateien:
#4974080
Lesenswert?

Florian R. schrieb:
> Ja ich muss die stm32f10x_it.c
> noch in .cpp abändern.

Genau das wird es sein. GCC entscheidet die Programmiersprache nach 
Dateiendung und hier wird die stm32f10x_it als C kompiliert, welche 
wiederum den "stm32f10x_conf.h" Header als C interpretiert, welche 
wiederum deine debug.hpp als C interpretiert.

Florian R. schrieb:
> Eine c-Datei erstellt mit den Variablen für die
> ISR, dann erst eine Cpp-Datei um diese zu verarbeiten. z.B. bei i2c.c
> und I2Cdev.cpp

Mal eine ganz andere Frage: Wieso nimmst du nicht durchgängig C++? Sonst 
hast du Probleme bei jeder Methode, die von C aus aufrufbar sein soll 
(Name Mangling, extern C als Präfix).

Wenn es darum geht, dass der generierte Startup Code in C ist, dann mach 
einen einfachen Header mit
1
extern C void cplusplus_startup();
und einer passenden start.cpp.

In dieser machst du dann alles, was du vorher in den stm32 files gemacht 
hast. Dies hat, wie jemand schon erwähnt hat, den Vorteil, dass dein 
Code völlig unabhängig vom benötigten Board ist bzw. auch nicht 
überschrieben wird, wenn dieser mal geupdated werden würde.
#4974122
Lesenswert?

Florian R. schrieb:
> Ja, die stm32f10x_conf.h wird in vielen anderen Headern eingebunden,
> aber in keiner c Datei.

Natürlich wird die das, halt nicht direkt, sondern indirekt. Das ändert 
aber nichts daran, das gcc die Programmiersprache anhand der Endung der 
zu kompilierenden Datei festlegt.

Und wenn die auf .c endet, dann ist das für gcc eine C-Datei, und es 
wird der C-Compiler aufgerufen. Der beschwert sich dann (zu Recht) über 
den C++-Code.

Wie aber schon richtig bemerkt wurde, ist das wilde Durcheinander von C- 
und C++-Code eh suboptimal. Das passiert, wenn man einfach überall 
zusammengeklaubte Files in ein Projekt zusammenkopiert, aber suboptimal 
bleibt es trotzdem.

Da wirst du etwas Hand anlegen müssen, und das alles glattziehen.
Das es ebenfalls keine gute Idee ist, in Systemheadern herumzuändern, 
wurde auch schon gesagt. Das macht man nur aus sehr, sehr guten Gründen, 
du hast gar keinen.


Oliver
#4974248
Lesenswert?

Es gibt aber zur stm32f10x_conf.h keine c-Datei also keine 
stm32f10x_conf.c ! Wieso also soll dann da der Fehler liegen?

Die Header ohne c-Datei kann doch beides, c und cpp einbinden???
Hat den jemand mein Projekt angeschaut? Es geht um die Zeile 58 in 
stm32f10x_conf.h ...#include "Serial.hpp"...

Erst heißt es, ich soll die StandardLib nicht abhändern, dann doch 
wieder alles in cpp umbennen? Die die c-Datei mit den ISRS ist noch rein 
c und ist auch richtig. SPÄTER werde ich diese abändern. Erstmal geht es 
rein um den Include-Fehler.
#4974363
Lesenswert?

Die Datei mystd.h inkludiert besagte "stm32f10x_conf.h".
mystd.c hingegen wird natürlich als C kompiliert, weshalb sowohl mystd.h 
als auch stm..._conf.h als C betrachtet werden. Da kannst du keine C++ 
Anweisungen benutzen.

Ich sehe auch keinen Grund wieso die conf.h deine Header brauchen 
sollte?
Der Header ist dazu da um Boardspezifische Funktionen bereitzustellen 
(z.B. stm32f10x_can.h)

Das gehört alles in die main.cpp, in der es sich ja schon befindet.
Warum hast du es also in die conf mit aufgenommen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren