C++ und c vermengen



  • Hallo,

    ich bin noch ein ziemlicher Neuling in C/C++ und habe eine kleine Frage.

    Was muss ich machen, damit ich Funktionen, welche mit C geschrieben sind in meinem C++ Programm verwenden kann. Also was muss explizit in meiner .cpp und derer .h stehen??
    Also angenommen ich habe eine beispiel.c und beispiel.h Datei. Und ich möchte die beispielfunktion() verwenden, welche in der .h als extern void beispielfunktion() steht.

    das mit dem: extern "C" void beispielfunktion() klappt bei mir nicht. Da kommt dann: syntax error before string constant

    wenn ich meine Headerdatei beispiel.h mit dem typischen #ifdef __cplusplus versehe. Dann kommen Meldungen wie multiple markers und previous declaration..

    Vielen Dank



  • Du brauchst nichts besonderes tun. In deiner C++ - Datei einfach die C-Header-Datei inkludieren und beim Linken die Implementationsdatei (.c) mitlinken. Ganz genau so, als waeren es C++ Dateien. Schliesslich ist C eine Untermenge von C++ *, alles was gueltiges C ist, ist also auch gueltiges C++ *.

    (* Das Kleingedruckte: ausser du verwendest C99-Sachen, dann gehts nicht mehr so einfach, denn in C99 sind Sachen drinnen, die in C++ nicht drinnen sind. C99 ist uebrigens der C-Standard der ISO aus dem Jahr 1999, wenn du das noch nie gehoert hast, ist die Wahrscheinlichkeit sehr gross, dass du keine C99-Features verwendest)



  • Blue-Tiger schrieb:

    Du brauchst nichts besonderes tun. In deiner C++ - Datei einfach die C-Header-Datei inkludieren und beim Linken die Implementationsdatei (.c) mitlinken. Ganz genau so, als waeren es C++ Dateien. Schliesslich ist C eine Untermenge von C++ *, alles was gueltiges C ist, ist also auch gueltiges C++ *.

    Das stimmt leider überhaupt nicht. Wenn das C-Programm mit einem C-Compiler übersetzt wurde, muss das C++-Programm durch extern "C" mitgeteilt bekommen, dass die Funktion nicht name-mangled wurde.

    @Somersault:
    Die Fehlermeldung hört sich an als hättest Du extern "C" durch den C-Compiler gejagt, und als hättest Du irgendwelche endifs vergessen. Zeig mehr Code.



  • danke,

    also ich bin jetzt bei der Fehlermeldung undefined reference to beispielfunktion()

    hab ich da was beim linken falsch gemacht und fehlt beim code was?


  • Mod

    Somersault schrieb:

    danke,

    also ich bin jetzt bei der Fehlermeldung undefined reference to beispielfunktion()

    hab ich da was beim linken falsch gemacht und fehlt beim code was?

    woher sollen wir das wissen?



  • mein Cpp Programm:

    #include "mein_cpp.h"
    #include <iostream>
    using namespace std;
    
    void Mein_CPP::request(req_hdr *hdr) {
    
    	 cout << "Methode: request" << endl;
    	 get_answer(hdr); // hier bekomme ich den besagten Fehler	 
    }
    

    .h dazu

    #ifndef MEIN_CPP_H
    #define MEIN_CPP_H
    #include <string>
    
    #include "nur_c.h"
    
    class Mein_CPP {
    
    public:
    
        void request (req_hdr *hdr);
    
    protected:
    
    private:
    
    };
    #endif //MEIN_CPP_H
    

    die nur_c.h file zur c Funktion:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #include <unistd.h>
    
    #include "constants.h"
    
    // keine Ahnung für was das gut, der code ist nicht von mir...
    #define bla_bla 300
    
    #define bla_blub 250
    
    // diese funktion will ich
    extern void get_answer ( req_hdr  * );
    
    #ifdef __cplusplus
    }
    #endif
    


  • Sieht alles richtig aus. Das C-Programm ist auch wirklich mit einem C-Compiler übersetzt?



  • LordJaxom_lg schrieb:

    Blue-Tiger schrieb:

    Du brauchst nichts besonderes tun. In deiner C++ - Datei einfach die C-Header-Datei inkludieren und beim Linken die Implementationsdatei (.c) mitlinken. Ganz genau so, als waeren es C++ Dateien. Schliesslich ist C eine Untermenge von C++ *, alles was gueltiges C ist, ist also auch gueltiges C++ *.

    Das stimmt leider überhaupt nicht. Wenn das C-Programm mit einem C-Compiler übersetzt wurde, muss das C++-Programm durch extern "C" mitgeteilt bekommen, dass die Funktion nicht name-mangled wurde.

    Er hat aber gesagt er haette die .c-Datei ebenfalls. Und dann kann man einfach beide mit dem C++ Compiler kompilieren.



  • das mit dem linken und compilieren ist in c/c++ ja nicht ganz so trivial, wie bei anderen Programmiersprachen..

    aber ich weiß das ich gcc habe und ein makefile, dass mir ebenfalls vorgegeben worden ist.

    ob diese Aussagen jetzt hilfreich sind, weiß ich leider nicht 😕



  • Blue-Tiger schrieb:

    Er hat aber gesagt er haette die .c-Datei ebenfalls. Und dann kann man einfach beide mit dem C++ Compiler kompilieren.

    Mitnichten kann man das, auch nicht bei reinem C89. Mit etwas Glück, ja, aber längst nicht immer.

    @Somersault:
    Schau, ob das C-File mit gcc und das C++-File mit g++ übersetzt werden.



  • unter discovery options bei eclipse steht "gcc c compiler und gcc c++ compiler". Das ist das projekt aus der ich die .h file ziehen möchte.

    mein cpp projekt wird mit den selben compilern kompeliert, unter settings steht hier noch g++ und weitere pfade (include path's)



  • Somersault schrieb:

    unter discovery options bei eclipse steht "gcc c compiler und gcc c++ compiler".

    Aha. Und?

    Das ist das projekt aus der ich die .h file ziehen möchte.

    Aha.

    *seufz*

    Okay, probier es bitte mal auf der Kommandozeile:

    gcc -o cprog.o cprog.c
    g++ -o cppprog.o cppprog.cpp
    g++ -o prog cprog.o cppprog.o
    


  • es war ein Linker Fehler 🙄
    omg, als noob hat man es nicht einfach.. aber das passiert mir nicht nochmal^^

    Danke für die Hilfe!!


Log in to reply