Announcement

Collapse
No announcement yet.

Compilierungsfehler beim mischen von C und C++

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Compilierungsfehler beim mischen von C und C++

    Hallo zusammen,
    Ich habe folgendes Problem:
    Ich möchte eine in C geschriebene Funktion in einer main.cpp aufrufen, kriege
    aber immer wieder unterschiedliche Fehlermeldung, obwohl ich den Compiler explizit mit extern "C" anweise diese Funktion doch bitte mit dem C-Compiler zu kompileren und den Rest, welcher C++ spezifisch ist, mit dem C++ Compiler zu kompilieren.
    Vielleicht weiß jemand von euch Rat.
    Probiere euch das ganze an Hand eines Beispiels besser zu illustrieren:

    Die Datei kontakt.c enthält nur eine printf Ausgabe der in konakt.h
    definierten Struktur kontakt:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include "kontakt.h"
    
    void printc(kontakt *ptr){
    	printf(" Vorname:%s \n Nachname:%s \n Identifikationsnummer:%d   \n                TelefonNr.:%d \n",ptr->vorname,ptr->name,ptr->id,ptr->tel);
    }
    Die Datei kontakt.cpp enthält wiederum eine Ausgabefunktion für eine zweite in kontakt.h definierte Struktur skontakt, diese Struktur enthält selber eine Ausgabefunktion:
    Code:
    #include <iostream>
    #include "kontakt.h"
    
    void skontakt::printcpp(){
            //Erstmal zu Testzwecken nur den Vornamen
    	std::cout<<"Vorname: "<<this->vorname<<"\n";    
    }
    Der Header zu der ganzen Geschichte sieht so aus:
    Code:
    #ifndef _KONTAKT_H
    #define _KONTAKT_H
    
    typedef struct kontakt{
    	char *vorname;
    	char *name;
    	int id;
    	int tel;
    }kontakt;
    void printc(kontakt *ptr);
    
    
    typedef struct skontakt{
    	char *vorname;
    	char *name;
    	int id;
    	int tel;
    	void printcpp();
    }skontakt;
    
    #endif
    Und als letztes die main.cpp in der ich die structs initialisiere und den Compiler
    explizit anweise die Funktion void printc(); mit dem C Compiler zu kompilieren.
    Habe auch schon probiert das extern "C" in den Header einzubauen, weiß aber nicht ganz wie ich es schachteln muss.
    Code:
    #include <iostream>
    #include "kontakt.h"
    extern "C" void printc(kontakt *ptr);
    
    int main( int argc,  char* argv[] ){
    	
    	kontakt *c;
    	c->vorname = "Peter";
    	c->name = "Lustig";
    	c->id = 9000;
    	c->tel = 190666666;
    	printc(c);
    	
    	
    	skontakt *c2;
    	c2->vorname = "Peter";
    	c2->name = "Lustig";
    	c2->id = 9000;
    	c2->tel = 190666666;
        c2->printcpp();
    
    }
    Fehlermeldung lautet wie folgt:
    1>main.cpp(5) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'printc'
    1> Siehe Deklaration von 'printc'

    Bei Zahlreichen anderen Versuchen bekam ich oftmals die Fehlermeldung über Fehlende externe Verweise auf entweder printc oder printcpp, weil meiner Vermutung nach die extern "C" Anweisung nicht richtig von mir umgesetzt wurde.
    Also ums nochmal zusammenzufassen sollten beide structs in einer Header definiert sein + die printc() Methode. Implementiert sollen die Funktionen in der main.cpp und auch als C++ kompiliert werden, halt mit der Einschränkung, dass auch die in C geschrieben printc() Funktion kompiliert wird.
    So hoffe das ist einigermaßen verständlich und jemand weiß Rat!
    lg Static

  • #2
    Hallo,

    das Problem wird die Redeklaration des Funktionsrumpfes im main.cpp sein.
    Außerdem hast Du weitere, gravierende Programmierfehler eingebaut.

    Ich möchte jetzt nicht jeden Fehler aufzählen, aber mit den folgenden Korrekturen sollte Dein Code kompilieren:

    Das erste struct ist eine reines C-Strukt und gehört in eine H-File.
    kontakt.h:
    Code:
    #ifndef _KONTAKT_H
    #define _KONTAKT_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    typedef struct kontakt {
      char *vorname;
      char *name;
      int id;
      int tel;
    } kontakt;
    
    void printc(const kontakt * const ptr);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    Das dazugehörende C-File sieht so aus:
    kontakt.c
    Code:
    #include "kontakt.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    void printc(const kontakt * const ptr)
    {
      printf("Vorname: %s\nNachname: %s\nIdentifikationsnummer: %d\nTelefonNr.: %d\n", ptr->vorname, ptr->name, ptr->id, ptr->tel);
    }
    Das zweite strukt enthält eine Funktion, ist also ein CPP-Strukt (wie eine Klasse) und gehört daher in ein HPP-File.
    skontakt.hpp:
    Code:
    #ifndef SKONTAKT_HPP_
    #define SKONTAKT_HPP_
    
    typedef struct skontakt {
      char *vorname;
      char *name;
      int id;
      int tel;
      void printcpp(void) const;
    } skontakt;
    
    #endif // SKONTAKT_HPP_
    Das dazugehörige CPP-File.
    skontakt.cpp:
    Code:
    #include <iostream>
    #include "skontakt.hpp"
    
    void skontakt::printcpp(void) const
    {
      //Erstmal zu Testzwecken nur den Vornamen
      std::cout << "Vorname: " << this->vorname << std::endl;
    }
    Und nun zum main.cpp. Hier bitte die Pointer auch erzeugen, sonst gibt es ein Segmentation fault bei der Ausführung. Oder einfach nur die Objekte anlegen und initialisieren. Hab mal beide Varianten aufgeführt.
    main.cpp:
    Code:
    #include "skontakt.hpp"
    
    extern "C" {
    #include "kontakt.h"
    }
    
    int main(int argc, char* argv[]) {
    
      char vorname[] = "Max";
      char name[] = "Mustermann";
    
      kontakt myContact;
      myContact.vorname = vorname;
      myContact.name = name;
      myContact.id = 1234;
      myContact.tel = 123456;
      printc(&myContact);
    
      skontakt *mySContact = new skontakt;
      mySContact->vorname = vorname;
      mySContact->printcpp();
    
      delete mySContact ;
    }
    Aufräumen bitte nicht vergessen (siehe main.cpp)!
    Beachte:
    Die Strings nicht direkt zuweisen sondern vorher erzeugen (als C-Array oder mit new, malloc, etc.)!
    Reine Printfunktionen, die keine Daten ändern, const deklarieren (auch die Parameter)!!!
    Benenne das C und CPP-File unterschiedlich, also nicht beide kontakt.c[pp], da der Compiler daraus ein .o-File erzeungt und das eine mit dem anderen überschreibt. Ich habe mal die CPP-Variante "skontakt" genannt, so wie die Struktur auch.

    Viel Spass!

    Comment

    Working...
    X