C In C++ main c methode aufrufen und ausgeben

marsmello

Ensign
Registriert
Juli 2008
Beiträge
209
Ich musste ein Programm (1x in C und 1x in C++) das den Inhalt von 2 Textdateien vergleicht und ausgibt ob diese gleich sind oder nicht. Funktionieren tut alles, allerdings hab ich nen Verständnis Problem.

Folgendes, ich hab 2 Klassen vergleich.c und vergleich1.cpp.

Diese wollte ich jetzt in einer extra Klasse (z.B. Ausgabe.cpp), welche nur die Main-Methode enthält, aufrufen. Wenn ich die C++ Variante ausgeben will funktioniert alles ohne Probleme, aber wenn ich jetzt die C Variante zusätzlich ausgeben will (in der gleichen main). Bekomme ich den Verweis das "..externe Inhalte konnten nicht aufgelöst werden..."

Das Problem konnt ich im Header lösen, in dem ich einen Verweis auf C eingefügt habe.

Aber wieso ist das so, ich denk C++ ist eine "Erweiterung" von C, also müsste es doch eigentlich auch so gehn?
 
C++ ist keine "Erweiterung" von C, sondern eine eigene Sprache. C und C++ haben sich mittlerweile weit auseinanderentwickelt. Merkwürdig, dass immer noch Leute diesen Irrglauben haben.
 
Mach das erst seit nen paar wochen. Naja gut wenn man es so sieht macht es sinn. Aber irgendwie wird c und c++ immer in einem Atemzug genannt und nen ganzen Teil der libraries von C find ich ja auch in C++ von daher dacht ich das es so ist.

Hier stehts auch netterweise so: http://www.tutorials.at/c/c-oder-cplusplus.html

C++ ist Nachfolger bzw. eine Erweiterung von C und wurde von Bjarne Stroustrup in den AT&T-Labs entwickelt. C++ ist zu C abwärtskompatibel, womit sich C-Programme auch mit einem C++-Compiler übersetzen lassen.
 
Zuletzt bearbeitet:
Der Linker generiert leicht unterschiedliche Formate, bei C++ werden Funktionen in der .o Datei mit Parametern gespeichert (kann ja dank Überladung mehrere Funktionen mit gleichen Namen haben), C Compiler eben nur den Funktionsnamen. Wenn man also aus C++ eine C Funktion aufrufen will, muss man dies dem Compiler kenntlich machen mit
extern "C"
{
//hier die deklaration der c funktion, kann auch ein include einer header datei sein
}
Wenn man das nicht macht, such eben der C++ Kompiler nach der Funktion mit Parametern, statt ohne und schlägt fehl. Jedenfalls wäre Überladung mit dem C-Compiler Format nicht zu machen gewesen, deswegen diese kleine Inkompatibelität.


http://developers.sun.com/solaris/articles/mixing.html
 
Das mit dem extern C hatte ich gefunden.

Danke dir.
 
C++ ist zu C abwärtskompatibel, womit sich C-Programme auch mit einem C++-Compiler übersetzen lassen.
Das mag vielleicht sein (wobei ich mir nicht sicher bin), aber die machen unter Umständen absolut nicht das Selbe. Siehe beispielsweise hier:
Code:
#include <stdio.h>

int main(void) {
    if(sizeof('a') == 1) {
        printf("Bitte erschieß mich! :(\n");
    } else {
        printf("Ich bin so froh! :D\n");
    }
    return 0;
}
 
Zuletzt bearbeitet:
Nicht jedes C-Programm ist notwendigerweise auf einem C++-Compiler überhaupt übersetzbar. Um nur ein ganz billiges Beispiel zu bringen:

Code:
int main(void)
{
    int class = 45354;
    return 0;
}

Und es gibt garantiert noch eine Menge anderer, weniger trivialer C-Konstrukte, bei denen dir ein C++-Compiler den Vogel zeigen wird. C und C++ haben gemeinsame Wurzeln und ähneln sich in vielen Punkten, aber damit hat sich's dann auch.
 
Oh ja, richtig. Dass ich auf soetwas offensichtliches nicht gekommen bin, wundert mich. :E
 
Ein moderner C++ Compiler ist bei der einen oder anderen Sache strenger. In C werden doch tatsächlich Funktionen impliziert deklariert, wenn nirgendwo eine Deklaration ist. Der C++ Compiler meckert da (C99 glaub ich im übrigen auch). Auch darf man natürlich in C keinen 'bool' Ersatz definieren (ist ja nicht im Sprachumfang), das kolidiert mit dem nativen bool in C++. Das sizeof Beispiel ist zwar richtig, aber wer lässt sich schon von einem Literal die Größe ausgeben, das ist ein doch ziemlich theoretischen Beispiel. Ich hab jedenfalls mit nur zwei/drei Änderungen ein C Programm dazugebracht, das man es sowohl mit C/C++ Kompilern übersetzen lässt. Und die Kompatibelität wird nicht außer Acht gelassen, in C99 sind etliche C++ Erweiterungen eingeflossen (//Kommentare, Variablen dürfen nicht mehr nur am Scope anfange deklariert werden, inline-Funktionen etc..), als auch C++11 wiederrum von C99, wenn auch nicht vollständig.

http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++
 
Das sizeof Beispiel ist zwar richtig, aber wer lässt sich schon von einem Literal die Größe ausgeben, das ist ein doch ziemlich theoretischen Beispiel.
Das muss ja kein zufälliger Bug sein, sondern man könnte es ja absichtlich benutzen, um zu erkennen ob man in einer C++-Umgebung ist und sich entsprechend anders verhalten?
 
Dafür gibt es Präprozessor-Direktiven, das ist doch ein wenig leserlicher als mit mit sizeof die Umgebung zu bestimmen...
#ifdef __cplusplus tut's jedenfalls auch.
 
Zurück
Oben