Forum: Compiler & IDEs c und c++ mischen


von olpo (Gast)


Lesenswert?

Hallo,

ich moechte gerne c unc c++ Dateien mischen.
Ich weiss, ich koennte auch googlen, aber da es zum Mischen mehrere 
Moeglichkeiten gibt, wollte ich einen profesionellen Rat fuer meinen 
Fall.

Also, dass Hauptprogramm ist in C und ich wuerde dort gerne am wenigsten 
aendern. C-main() ruft dann in c++ meinCppLoop() auf, der wiederum 
Funktionen in C aufruft.
1
// C
2
callMe();
3
4
main(){
5
 meinCppLoop();
6
 return 0;
7
}
1
// C++
2
meinCppLoop(){
3
 while(1){
4
  callMe();
5
 }
6
}

Danke

von Kaj (Gast)


Lesenswert?

olpo schrieb:
> einen profesionellen Rat
Mach es sauber und vernünftig und nicht so ein hick hack.

von Yalu X. (yalu) (Moderator)


Lesenswert?

olpo schrieb:
> Ich weiss, ich koennte auch googlen, aber da es zum Mischen mehrere
> Moeglichkeiten gibt, wollte ich einen profesionellen Rat fuer meinen
> Fall

Wieviele unterschiedliche Möglichkeiten hast du denn schon gefunden?

Mir fällt nur eine einzige sinnvolle ein, nämlich die Funktionen callMe
und meinCppLoop im C++-Teil als extern "C" zu deklarieren, damit callMe
von C++ aus und meinCppLoop von C aus aufgerufen werden kann.

Diese Deklarationen macht man am besten in entsprechenden Header-Files,
die von beiden Teilen includet werden. Damit der C-Compiler nicht über
das extern "C" stolpert, muss dieses für C mit #ifdef __cplusplus
unsichtbar gemacht werden.

von Dr. Sommer (Gast)


Lesenswert?

olpo schrieb:
> Also, dass Hauptprogramm ist in C und ich wuerde dort gerne am wenigsten
> aendern.

Wie wäre es damit, das Hauptprogramm und alle anderen "C" Teile einfach 
mit einem C++ Compiler zu kompilieren? C++ ist größtenteils 
abwärtskompatibel und erfordert nur winzige Änderungen an wenigen 
Stellen (ohne dass diese Teile danach nicht mehr als C kompilierbar 
wären). Einfach mit als C++ kompilieren und die Warnungen/Fehler 
beheben.
So ersparst du dir die Fummeleimit 'extern "C"'.

von olpo (Gast)


Lesenswert?

ok danke,

ich wusste nicht, dass dieses Querzugreifen auch so einfach geht.

Leider hat sich doch noch ein Problem aufgetan: Der C-Code hat einige 
#IFDEFs, die ich auch setze.

Der CPP-Code muss jetzt eine Header-Datei aus dem C-Code einfuegen, die 
eben diese #IFDEFs beinhaltet.
Aber mein Compiler schafft das nicht aufzuloesen. Er behauptet, die 
#IFDEFs waeren nicht gesetzt.

Was kann ich da tun?

von Rolf Magnus (Gast)


Lesenswert?

olpo schrieb:
> Leider hat sich doch noch ein Problem aufgetan: Der C-Code hat einige
> #IFDEFs, die ich auch setze.
>
> Der CPP-Code muss jetzt eine Header-Datei aus dem C-Code einfuegen, die
> eben diese #IFDEFs beinhaltet.
> Aber mein Compiler schafft das nicht aufzuloesen. Er behauptet, die
> #IFDEFs waeren nicht gesetzt.
>
> Was kann ich da tun?

Es richtig machen. Der Präprozessor funktioniert in C++ auch nicht 
anders als in C. Da du nichts genaueres über die Art, wie du es 
versuchst und über den Fehler sagt, kann man dir auch keinen besseren 
Rat geben.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

olpo schrieb:
> #IFDEF

Es heißt #ifdef denn C unterscheidet zwischen Groß- und Kleinschreibung.

von olpo (Gast)


Lesenswert?

Hallo,

mein letztes Problem war durch doppelte Include-Files bedingt...

Yalu X. schrieb:
> Mir fällt nur eine einzige sinnvolle ein, nämlich die Funktionen callMe
> und meinCppLoop im C++-Teil als extern "C" zu deklarieren, damit callMe
> von C++ aus und meinCppLoop von C aus aufgerufen werden kann.
>
> Diese Deklarationen macht man am besten in entsprechenden Header-Files,
> die von beiden Teilen includet werden. Damit der C-Compiler nicht über
> das extern "C" stolpert, muss dieses für C mit #ifdef __cplusplus
> unsichtbar gemacht werden.

Ich mache das so in meinen Header-Dateien:
1
#ifdef __cplusplus
2
#define C_API extern "C"
3
#else
4
#define C_API
5
#endif
6
7
C_API void callMe(void);
1
C_API void callMe(void){
2
  printf("Bier:gut);
3
}

Ich bekomme aber folgende Fehlermeldung:
1
header.h:53:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
Der Fehler wird geworfen, wenn eine C-Datei kompiliert wird, die 
Header.h einbindet. callMe() wird in einer anderen C-Datei definiert.

Kann damit jmd etwas anfangen?

von Rolf Magnus (Gast)


Lesenswert?

olpo schrieb:
> Ich bekomme aber folgende Fehlermeldung:
> header.h:53:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’
> before ‘void’

Wie man schon leicht am Syntax Higlighting erkennen kann, fehlt oben ein 
Anführungszeichen. Allerdings geht's wohl nicht um den oben gezeigten 
Code, denn der hat gar keine 53 Zeilen.

von olpo (Gast)


Lesenswert?

Entschuldigung, da hat sich ein Syntaxfehler in meinen Code 
eingeschlichen.

Ich sollte so spät keine Fragen mehr stellen...

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.