Kooperation von C und C++?

UncleBob

Mitglied
Hallo,

Ich habe Sourcecode einer drittpartei, in C. Ich möchte ihn gerne in meine C++ applikation einbauen, verstehe allerdings nicht allzuviel von solchen sachen.

Ich kann die Sln im VS öffnen und builden, überhaupt kein Problem. Der C-Code errechnet gewisse daten und gibt diese in ein File aus. Alles was ich daran ändern möchte ist eigentlich lediglich dass die Daten stadtdessen in den Datentyp ausgegeben werden den ich dafür angelegt habe, damit ich sie in meinem Hauptprogramm weiterverarbeiten kann.

Jetzt ist aber das Problem: Ich füge dem C-projekt meine neue Klasse hinzu, und die Definition wird nicht anerkannt. Ist nichts gewaltiges, schlicht und einfach

class MyClass
{
public:
MyClass(void);
~MyClass(void)
.
.
.
};

Wenn ich die Klasse includiere spuckt mir der Compiler gleich für die erste Zeile einen Fehler aus:

error C2061: Syntaxfehler: Bezeichner 'MyClass'

offensichtlich fehlt ihm die Typdefinition, dabei ist das ja die Typdefinition. Ich denke mal das liegt daran das der ganze Rest des Projektes in C ist, denn ich hätte das Problem noch nie gehabt.

Ich habe auch versucht den Code in cpp files zu kopieren und in einem C++ projekt laufen zu lassen, aber dann überschlagen sich die Fehlermeldungen förmlich, und ich bin nicht gerade der Erfahrenste (C hab ich überhaupt nie verwendet, und C++ auch noch nicht so viel), weshalb ich mir den Horror die alle auszumerzen gerne ersparen würde. Gibt es da eine Möglichkeit?
 
Hm wenn de es nur in dem anderen Format speichern willst, ist die Frage, ob du nicht einfach hingehen willst und das speichern (in c) umschreiben ...

ansonsten einfach mal ne neue .cpp-Datei hinzufügen und ne neue .h (.hpp) datei, dann darin deine Klasse und schon sollte das eigtl. funktionieren ;) Die Dateiendungen sind für den Compiler teilweise schon von Bedeutung ;)
 
Hm wenn de es nur in dem anderen Format speichern willst, ist die Frage, ob du nicht einfach hingehen willst und das speichern (in c) umschreiben ...

Das Endprodukt MUSS in C++ sein, da ich das ganze dann in eine grössere C++ applikation einbaue, die dann wiederum als DLL in ein anderes Programm eingeklinkt wird. Wenn ich also übersetzen würde würde ich den ganzen C code nehmen und zu C++ umschreiben, aber ich bin von den 130 Fehlermeldungen, die zu bewältigen sind, etwas eingeschüchtert (hab mir die mal angesehen, und bei den wenigsten wusste ich was umschreiben). Wenns anders nicht geht müsste ich mir das wohl trotzdem antun...

ansonsten einfach mal ne neue .cpp-Datei hinzufügen und ne neue .h (.hpp) datei, dann darin deine Klasse und schon sollte das eigtl. funktionieren Die Dateiendungen sind für den Compiler teilweise schon von Bedeutung

Das ist genau das was ich oben gemacht habe, mit dem Resultat das er die "class"-definition nicht erkennen will... :(
 
Hi.
Das Endprodukt MUSS in C++ sein, da ich das ganze dann in eine grössere C++ applikation einbaue, die dann wiederum als DLL in ein anderes Programm eingeklinkt wird. Wenn ich also übersetzen würde würde ich den ganzen C code nehmen und zu C++ umschreiben, aber ich bin von den 130 Fehlermeldungen, die zu bewältigen sind, etwas eingeschüchtert (hab mir die mal angesehen, und bei den wenigsten wusste ich was umschreiben).
Die meisten der Fehler sind sicherlich Folgefehler.

Wenn du eine der C Funktionen umschreiben mußt damit die Ausgabe nicht in eine Datei sondern einen C++ Datentyp erfolgt, dann kommst du nicht darum herum den entsprechenden Code (also diese eine Funktion) nach C++ umzuschreiben.

Im Visual Studio kannst du für jede Datei einstellen ob sie als C++ oder C Code behandelt werden soll.

Wenn du den (restlichen) C Code von einer C++ Datei ansprechen willst, dann sollten dort entsprechende extern "C" Deklarationen in den Headerdateien eingefügt werden.

Gruß
 
Visual Studio bestimmt anhand der Extension (.c bzw. .cpp) wie der Code zu kompilieren ist. Wenn du eine Klasse in ein .c-File reinsetzt, wird der C-Compiler meckern.
 
Im Visual Studio kannst du für jede Datei einstellen ob sie als C++ oder C Code behandelt werden soll.

EDIT: Ok, ich habe die einstellung gefunden, sie kann aber nur bei sourcefiles eingestellt werden. Der Fehler den ich oben beschrieben habe entsteht im header-file, und da kann ich das nicht einstellen (oder hätte die Einstellung nicht gefunden). Die einstellung beim cpp-file ist richtig (/tp)
 
Zuletzt bearbeitet:
EDIT: Ok, ich habe die einstellung gefunden, sie kann aber nur bei sourcefiles eingestellt werden. Der Fehler den ich oben beschrieben habe entsteht im header-file, und da kann ich das nicht einstellen (oder hätte die Einstellung nicht gefunden). Die einstellung beim cpp-file ist richtig (/tp)
Die Einstellung macht bei einer Headerdatei auch keinen Sinn. Eine Headerdatei wird ja auch nicht kompiliert sondern in eine andere Datei eingebunden.

\edit: wenn du in eine Datei die als C Code kompiliert wird eine C++ Headerdatei einbindest sind Fehler natürlich vorprogrammiert.

Gruß
 
Aha... und wie müsste ich dann vorgehen? irgendwie muss ich ja eine kommunikation zwischen den teilen aufbauen...

Vielleicht wäre es hilfreich wenn ich die Sache ein bisschen deutlicher darstelle. Hab sie mal aufs Minimum reduziert um es übersichtlicher zu machen, der Fehler kommt immer noch vor.

der header ist ein hpp-file, sieht ganz normal aus:

Code:
#pragma once

class ES_Stuff
{
public:
	ES_Stuff(void);
	~ES_Stuff(void);
};

Die fehlermeldungen folgendermassen:

Code:
Syntaxfehler: Bezeichner 'ES_Stuff'
1>e:\orbiter\mods\msss\orbitersdk\samples\stargen source\es_stuff.hpp(3) : error C2059: Syntaxfehler: ';'
1>e:\orbiter\mods\msss\orbitersdk\samples\stargen source\es_stuff.hpp(4) : error C2449: '{' auf Dateiebene gefunden - fehlt der Funktionskopf?
1>e:\orbiter\mods\msss\orbitersdk\samples\stargen source\es_stuff.hpp(8) : error C2059: Syntaxfehler: '}'

das sourcefile ist ein cpp-file, ebenfalls sehr unspektakulär:

Code:
#include "ES_Stuff.hpp"

ES_Stuff::ES_Stuff(void)
{
}

ES_Stuff::~ES_Stuff(void)
{
}

Hier gibt es ein paar fehlermeldungen die aber daher stammen das die Definition im Header nicht akzeptiert wurde, also nichts wichtiges.

ES_Stuff.hpp wird dann im .C file ganz normal eingebunden:

#include "ES_Stuff.hpp"

Die Sache buildet problemlos wenn ich die Inkludierung entferne, erst wenn ich die hpp-datei einbinde kommen die Fehlermeldungen. Das würde also wunderbar zu dem passen was du vorhin geschrieben hast. Nur: wie bringe ich denn meine Daten rüber wenn ich meine klasse nicht inkludieren kann? Ein struct in C schreiben und dieses dann im C++ code inkludieren?
 
Zuletzt bearbeitet:
ES_Stuff.hpp wird dann im .C file ganz normal eingebunden:

#include "ES_Stuff.hpp"
Was völliger Unsinn ist und nicht funktionieren wird. Du kannst in C keinen C++ Code verwenden. Punkt.

Gruß

\edit:
Nur: wie bringe ich denn meine Daten rüber wenn ich meine klasse nicht inkludieren kann? Ein struct in C schreiben und dieses dann im C++ code inkludieren?
In C kannst du natürlich jeden beliebigen C Datentyp verwenden, nur keine C++ Sprachelemente.
 
Zuletzt bearbeitet:
Zurück