Frage zu extern "C"
-
Danke an alle für die Hilfe, jetzt funktioniert es, hier nochmal alle Programme vielleicht kann wer anderes damit auch noch was Anfangen. Ich hab bei wikipedia auch noch 2 interessante Links gefunden:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
http://en.wikipedia.org/wiki/Name_manglingDie C++ Version:
main.cpp
#include <iostream> #include "my_header.h" using namespace std; int main(int argc, char* argv[]) { check_if_file_exists (); system("PAUSE"); return 0; }
my_header.h
#ifndef my_header #define my_header /*/ __cplusplus wird automatisch vom Compiler definiert, wenn ein C++ Compiler verwendet wird (Ist im C++ Standart so festgelegt) /*/ #ifdef __cplusplus // Wenn kein C++ Compiler verwendet wird, dann wird void check_if_file_exists(); ganz normal aufgerufen extern "C" { // Wenn ein C++ Compiler verwendet wird dann wird die Funktion check_if_file_exists(); // mit den C Symbolnamen Compiliert http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B // Weiteres Stichwort: "name mangling" http://en.wikipedia.org/wiki/Name_mangling #endif void check_if_file_exists(); #ifdef __cplusplus // Falls ein C++ Compiler verwendet wurde dann wird hier die Klammer vom exter "C" Befehl geschlossen. } #endif #endif
my_functions.c
#include "my_header.h" #include <iostream> #include <fstream> void check_if_file_exists() { std::ifstream file ("test.txt"); if ( file == NULL ) { std::cout<<"Die Datei test.txt existiert nicht\n"<<std::endl; } else { std::cout<<"test.txt existiert"<<std::endl; } }
Und jetzt die C Version
main.c
#include <stdio.h> #include "my_header.h" int main() { check_if_file_exists(); system("PAUSE"); return 0; }
my_header.h
#ifndef my_header #define my_header #ifdef __cplusplus // Wenn kein C++ Compiler verwendet wird, dann wird void check_if_file_exists(); ganz normal aufgerufen extern "C" { // Wenn ein C++ Compiler verwendet wird dann wird die Funktion check_if_file_exists(); // mit den C Symbolnamen Compiliert http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B // Weiteres Stichwort: "name mangling" http://en.wikipedia.org/wiki/Name_mangling #endif void check_if_file_exists(void); // Wenn aus C eine C++ Funktion aufgerufen werden soll, // und die C++ Funktion keine Parameter erwartet dann muss // der Übergabeparameter void sein, das void muss man nur hier // in my_header.h schreiben #ifdef __cplusplus // Falls ein C++ Compiler verwendet wurde dann wird hier die Klammer vom exter "C" Befehl geschlossen. } #endif #endif
my_functions.cpp
#include "my_header.h" #include <iostream> #include <fstream> void check_if_file_exists() { std::ifstream file ("test.txt"); if ( file == NULL ) { std::cout<<"Die Datei test.txt existiert nicht\n"<<std::endl; } else { std::cout<<"test.txt existiert"<<std::endl; } }
-
#include <stdio.h> #include "my_header.h" int main() { check_if_file_exists(); system("PAUSE"); return 0; }
Schöner:
#include <cstdio>//Benutze die C++-Version dieses Headers #include "my_header.h" int main() { check_if_file_exists(); for(;;);//return-Statement eig. unnötig, es wird Standardmäßig 0 zurückgegeben (Achtung, nur bei main()!) }//system("pause"); ist unportabler Blödsinn. Nimm lieber eine Endlosschleife
Edit: Und brav auf Formattierung achten!
-
Wieso gibt es denn jetzt 2mal eine my_header.h-Datei (Einmal im Abschnitt "C++-Version" und einmal im Abschnitt "C-Version")? Kann das nicht jedes mal dieselbe sein? Die Headerdatei definiert eine C-Schnittstelle. Auf welcher Seite welche Sprache verwendet wird, ist dann ja eigentlich egal, sofern man dort den __cplusplus-Trick eingebaut hat.
Dein IncludeGuard besteht wieder aus Kleinbuchstaben.
-
Hacker schrieb:
//system("pause"); ist unportabler Blödsinn. Nimm lieber eine Endlosschleife
Super Alternative
-
@Hacker: Du hast echt ein komisches Verständnis von Schönheit. Die CPU-Resourcen-verschwendende Tu-Gar-Nichts-Schleife geht ja mal gar nicht!
-
Hacker schrieb:
// Nimm lieber eine Endlosschleife
Das ist undefinierter Blödsinn.
-
Gut, Vorschlag:
std::cin.get();
-
Immer noch nicht gut. Wir haben hier eine FAQ, falls du es noch nicht wusstest.
-
Und was spricht gegen system("pause") wenn er auf seinem Windows-Rechner spielt?
Bezweifle dass seine Spielereien jemals ernsthafte Software werden, die er portieren möchte.
-
Ethon__ schrieb:
Und was spricht gegen system("pause") wenn er auf seinem Windows-Rechner spielt?
Bezweifle dass seine Spielereien jemals ernsthafte Software werden, die er portieren möchte.@SeppJ: Ja, ich weiß dass es hier eine FAQ gibt.
Da steht aber auch nichts großartig anderes drinnen.
-
Hacker schrieb:
@SeppJ: Ja, ich weiß dass es hier eine FAQ gibt.
Da steht aber auch nichts großartig anderes drinnen.Und ob da was anderes drinsteht. Da steht nämlich kein einziger deiner Unsinnsvorschläge.
-
void wait () { std::cin.clear(); std::cin.ignore(cin.rdbuf()->in_avail()); std::cin.get(); }
Diese Funktion verfeinert nur, was ich mit std::cin.get() bereits vorschlug. Und ist nebenbei die erste vorgeschlagene Alternative.
-
Dann ist Photoshop eine Verfeinerung von MS-Paint.
-
SeppJ schrieb:
Dann ist Photoshop eine Verfeinerung von MS-Paint.
Schön.
-
Hacker schrieb:
SeppJ schrieb:
Dann ist Photoshop eine Verfeinerung von MS-Paint.
Ich bin ganz ehrlich - hab noch nie Photoshop genutzt. Und wenn du jetzt denkst ich bin dumm wie Scheiße- bitte. Aber ich glaub sogar, dass das (teilweise) stimmt.
Das war durchaus auch so gedacht, dass dies zwar technisch gesehen eine Verfeinerung ist, aber dass da Welten dazwischen liegen. Vielleicht ein Autobeispiel? VW-Käfer vs. Golf 5 GTI.