Forum: Compiler & IDEs Header einer Cpp-Datei einbinden


von Florian R. (fxlxo)


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ß

von Marc S. (darkchaos)


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

von Max (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Die Frage ist wohl eher, in was stm32f10x_conf.h eigentlich includiert 
ist. Denn ganz alleinstehend lässt die sich nicht kompilieren.

Oliver

von Max (Gast)


Lesenswert?

Nein, wenn der Header ordentlich inkludiert, was er braucht, muss uns 
das Drumrum nicht interessieren.

von Oliver S. (oliverso)


Lesenswert?

Dann kompiliert mal eine .h- Datei alleine...

Zudem geht's hier tatsächlich um C/C++

Florian R. schrieb:
> Nun bekomme ich Compilerfehler wie z.B. unknown type bool, unknown type
> class, usw...

Dafür brauchts keine Header, das ist C++ Sprachstandard.

Oliver

von Johnny B. (johnnyb)


Lesenswert?

Oliver S. schrieb:
> Dann kompiliert mal eine .h- Datei alleine...

Naja, dem Compiler ist die Dateiendung ziemlich schnuppe, es muss sich 
darin lediglich gültige C bzw. C++ Syntax befinden.

von Markus F. (mfro)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Florian R. schrieb:
> 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".

Das klingt so für sich schon sehr merkwürdig. Warum sollte man das 
wollen?

von Hans (Gast)


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.

von Florian R. (fxlxo)


Angehängte Dateien:

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ß

von Marc S. (darkchaos)


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.

von Oliver S. (oliverso)


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

: Bearbeitet durch User
von Florian R. (fxlxo)


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.

von Marc S. (darkchaos)


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?

von Florian R. (fxlxo)


Lesenswert?

ok ich hab mein Projekt von unnötigen c Dateien bereiningt und alles in 
eine main.hpp umverlagert. Danke für die Tipps. Jetzt funktionierts!!!

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.