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_mangling

    Die 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!


  • Mod

    Hacker schrieb:

    // Nimm lieber eine Endlosschleife
    

    Das ist undefinierter Blödsinn.



  • Gut, Vorschlag:

    std::cin.get();
    

  • Mod

    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.


  • Mod

    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.


  • Mod

    Dann ist Photoshop eine Verfeinerung von MS-Paint.



  • SeppJ schrieb:

    Dann ist Photoshop eine Verfeinerung von MS-Paint.

    Schön.


  • Mod

    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.


Anmelden zum Antworten