C und C++ mixen

hallo.

habe hier eine main.c mit main() funktion.
die ruft eine funktion f1 aus einer cpp-datei auf.
diese ist natürlich artig in der entsprechenden header-datei mit einem #ifdef __cplusplus als extern „C“ deklariert.
f1 ruft eine weitere cpp-funktion f2 auf, die in derselben cpp-datei definiert ist.
die deklaration von f2 befindet sich NICHT in der header-datei, sondern in der cpp-datei selbst.
beim bauen beschwert sich jetzt der linker, er würde f2 nicht finden („unresolved symbol“).
warum?
die einzige beziehung zwischen main und cpp ist doch der aufruf von f1, d.h. mit welchem symbolnamen f2 compiliert wird, kann der main völlig egal sein.
oder doch nicht?
f2 auch als extern „C“ zu deklarieren scheidet jedenfalls aus, weil diese eine parameterübergabe per referenz macht, was C ja wieder nicht kennt.

natürlich läßt sich das problem mit ein paar modifikationen umschiffen. aber mich würde interessieren, was hier überhaupt das problem ist.

gruß

michael

Hallo ,

hallo.

habe hier eine main.c mit main() funktion.
die ruft eine funktion f1 aus einer cpp-datei auf.
diese ist natürlich artig in der entsprechenden header-datei
mit einem #ifdef __cplusplus als extern „C“ deklariert.

damit bekannt als

f1 ruft eine weitere cpp-funktion f2 auf, die in derselben
cpp-datei definiert ist.

ok und wehm soll das nun bekannt sein ? es geht um compilieren und nicht um module die man einbindet, da wäre es in der tat egal wie was wo , da braucht es nur den einen externen eingangspunkt.

die deklaration von f2 befindet sich NICHT in der
header-datei, sondern in der cpp-datei selbst.
beim bauen beschwert sich jetzt der linker, er würde f2 nicht
finden („unresolved symbol“).

weil das C++ ja als C behandelt wird und bei aufruf der funktion f2 gibt es kein interface zum C , also existiert es noch gar nicht , c++ ist ja nich eigenständig compiliert , wie gesagt .

warum?
die einzige beziehung zwischen main und cpp ist doch der
aufruf von f1, d.h. mit welchem symbolnamen f2 compiliert
wird, kann der main völlig egal sein.
oder doch nicht?

??? wie gesagt, compilier jedes für sich und dann mit loadmodule oder sowas arbeiten .

f2 auch als extern „C“ zu deklarieren scheidet jedenfalls aus,
weil diese eine parameterübergabe per referenz macht, was C ja
wieder nicht kennt.

tja , neue funktion schreiben :wink:

natürlich läßt sich das problem mit ein paar modifikationen
umschiffen. aber mich würde interessieren, was hier überhaupt
das problem ist.

ja , den das was du da denkst entspricht nciht dem compiliervorgang.

gruß

michael

naja, ich bin nicht so ein fachman für compiler, aber da haut die logic schon ausm rahmen …

hallo.

ok und wehm soll das nun bekannt sein ? es geht um compilieren
und nicht um module die man einbindet, da wäre es in der tat
egal wie was wo , da braucht es nur den einen externen
eingangspunkt.

na der eingangspunkt ist doch f1. oder wie?

weil das C++ ja als C behandelt wird und bei aufruf der
funktion f2 gibt es kein interface zum C , also existiert es
noch gar nicht , c++ ist ja nich eigenständig compiliert , wie
gesagt .

die cpp-datei wird natürlich eigenständig compiliert.
mit „extern „C““ soll doch nur der symbolname für f1 C-konform übersetzt werden, oder nicht?
warum soll denn die funktion f2 ein interface zum C brauchen? die wird doch von C gar nicht direkt aufgerufen.

??? wie gesagt, compilier jedes für sich

mach ich ja.

und dann mit
loadmodule oder sowas arbeiten .

???

naja, ich bin nicht so ein fachman für compiler

ich auch nicht.

aber da haut die logic schon ausm rahmen …

naja… bin mir da noch nicht ganz sicher. ich hab zwischenzeitlich spaßeshalber mal die main als cpp bauen lassen und krieg dasselbe problem. das kann doch gar nicht sein… :-/

gruß

michael

Hallo Michael,

diese ist natürlich artig in der entsprechenden header-datei
mit einem #ifdef __cplusplus als extern „C“ deklariert.
f1 ruft eine weitere cpp-funktion f2 auf, die in derselben
cpp-datei definiert ist.
die deklaration von f2 befindet sich NICHT in der
header-datei, sondern in der cpp-datei selbst.
beim bauen beschwert sich jetzt der linker, er würde f2 nicht
finden („unresolved symbol“).
warum?

Weil die C+±Funktion nichf2 heisst!

In C++dürfen Funktionen überladen werden, wenn sie sich in den Parametern unterscheiden.
Deshalb hängt der C+±Compiler Kürzel am Funktionsnamen an, welche die Paramettypen beschreiben, C macht das nicht!

https://en.wikipedia.org/wiki/Name_mangling

Dies hier sollte dir weiter helfen:
http://www.textarchiv.alojado.de/text/explizites_lin…

MfG Petr(TOO)

Hi Michael,

das ist erstmal ein Kuddel-Muddel, was du da beschreibst.

habe hier eine main.c mit main() funktion.
die ruft eine funktion f1 aus einer cpp-datei auf.
diese ist natürlich artig in der entsprechenden header-datei
mit einem #ifdef __cplusplus als extern „C“ deklariert.

wieso das?

Zunaechst einmal die Frage, wird dein main.c mit gcc oder mit g++ uebersetzt, also mit einem C oder mit einem C++ Compiler? Gib uns doch mal die Dateiinhalte (mit Namen) und die Kommandos mit denen du uebersetzt und linkst und damit auch die Fehlermeldungen. Das Beispiel kannst du runterstrippen bis auf die Bodies von f1, f2 und den Aufruf in main.

Das extern „C“ spezifiziert externes C Linkage zu deiner Funktion f1, welche aber ja wohl nach deiner Beschreibung einer C++ Datei ist und somit auch von einem C++ Compiler uebersetzt werden duerfte.

f1 ruft eine weitere cpp-funktion f2 auf, die in derselben
cpp-datei definiert ist.

Das ist unabhaengig vom Compiler immer moeglich und erzeugt in der Regel sehr sehr selten Probleme. Vielleicht hast du final aber dein Objekt nicht gelinkt…

die einzige beziehung zwischen main und cpp ist doch der
aufruf von f1, d.h. mit welchem symbolnamen f2 compiliert
wird, kann der main völlig egal sein.
oder doch nicht?

siehe oben. Wenn im Header extern „C“ steht, du aber in der cpp f1 als C++ Funktion definierst, so findet er primaer schon mal f1 nicht.

natürlich läßt sich das problem mit ein paar modifikationen
umschiffen. aber mich würde interessieren, was hier überhaupt
das problem ist.

das wuerden wir auch wissen wollen. Gib uns doch mal die runtergestrippten Dateiinhalte .

Gruss
E.

hallo peter.

Weil die C+±Funktion nichf2 heisst!

bin mir nicht sicher, ob du meine frage falsch verstanden hast oder ich immer noch aufm schlauch stehe… :smile:

In C++dürfen Funktionen überladen werden, wenn sie sich in den
Parametern unterscheiden.
Deshalb hängt der C+±Compiler Kürzel am Funktionsnamen an,
welche die Paramettypen beschreiben, C macht das nicht!

das ist soweit klar! deshalb ist ja f1 als extern „C“ deklariert, d.h. der c++ compiler macht das symbol für den linker C-konform.
der linker findet dann auch f1.
aber warum will er auch f2 C-konform haben?
das vom c++compiler erzeugte symbol für f2 könnte doch ruhig c++like sein. es wird ja nur von c++funktionen (nämlich f1) referenziert…?

aaaber:
nachdem ich mittlerweile ein neues „nacktes“ projekt mit genau der problemstellung erzeugt habe und es hier wie von mir erwartet funktioniert, bin ich ziemlich sicher, daß der fehler irgendwo in den von irgendwoher übernommenen compilersettings liegt.

es wird wahrscheinlich sowieso darauf hinauslaufen, daß ich das ganze ding auf c++ umbaue.
trotzdem vielen dank!

gruß

michael

Hallo Michael,

es hängt wohl mit dem Compiler/Linker zusammen, diese arbeiten durchaus unterschiedlich.

Ich habe Dein Beispiel bei mir auf dem C-Builder getestet und es funktioniert.
Obwohl ich beim Lesen noch daran dachte, dass die Deklaration der f2 auch in die Headder-datei müsste:
weil der Linker die f1 mit der beinhaltenden f2 im main einbaut!

Bei C-Builder also nicht!

Gruss
Uli