struct Konflikt zwischen C und C++ ?



  • Ja hi, also ich habe folgendes Problem:

    Ich hab ein funktionierendes C-Projekt bestehend aus ner main.c, ner .lib
    und zwei, die Funktionen der LIB deklarierenden, Header-files.
    So, jetzt soll das ganze in ein C++ Projekt eingebaut werden. Dazu hab ich
    in meinem jugendlichen Leichtsinn im C++ Projekt einfach eine neue Datei
    namens "capi.cpp" hinzugefügt (es geht um ISDN) und dann per Copy&Paste
    einfach den alten Quelltext reinkopiert, die MAIN-Funktion entfernt (sodass
    nur nur Funktionsdefinitionen übrig geblieben sind) und schließlich noch die
    LIB dem Projekt beigefügt.
    Erwartungsgemäß funktioniert das natürlich nicht. 😃
    Das Problem scheint wohl irgendwie bei der unterschiedlichen Definition von
    structs beider Programmiersprachen zu liegen. Ich nehme mal an, das ist so ne
    public, private Sache (leider kenne ich mich da nicht wirklich aus).

    Hier mal die Fehlermeldung vom Compiler (MSVC++ 6):
    capi.cpp(165) : error C2027: Verwendung des undefinierten Typs "_MSG_HEADER"
    capi20.h(510) : Siehe Deklaration von '_MSG_HEADER'

    Und jetzt der Teil im Header, wo _MSG_HEADER eigentlich definiert wird:

    typedef struct _API_MSG CAPI_MSG;
    typedef struct _MSG_HEADER CAPI_MSG_HEADER;
    
    struct _API_MSG {
      struct _MSG_HEADER {
        word        length;
        word        appl_id;
        word        command;
        word        number;
        byte        controller;
        byte        plci;
        word        ncci;
      } header;
      union {
        _ALT_REQP           alert_req;
        _ALT_CONP           alert_con;
        ...
        _CON_B3_T90_A_RESP  connect_b3_t90_a_res;
        byte                b[200];
      } info;
    };
    

    Keine Ahnung, wieso der Compiler das nicht checkt. Ich hab auch mal an verschiedensten Orten in der Definition "public:" davor geschrieben, aber structs sind ja anscheinend public, so dass das auch nichts gebracht hat.

    Wäre echt nett, wenn mir da jemand helfen könnte.
    Tschö



  • Versuch doch mal

    1. das typedef nach der struct definition zu schreiben und
    2. da es verschachtelt ist so:

    struct _API_MSG {
      struct _MSG_HEADER {
        word        length;
        word        appl_id;
        word        command;
        word        number;
        byte        controller;
        byte        plci;
        word        ncci;
      } header;
      union {
        _ALT_REQP           alert_req;
        _ALT_CONP           alert_con;
        ...
        _CON_B3_T90_A_RESP  connect_b3_t90_a_res;
        byte                b[200];
      } info;
    };
    
    typedef struct _API_MSG CAPI_MSG;
    typedef struct _API_MSG::_MSG_HEADER CAPI_MSG_HEADER;
    

    Desweiteren kann man sich das 1. typedef auchsparen wenn du das struct so schreibst:

    struct _API_MSG {
      struct _MSG_HEADER {
        word        length;
        word        appl_id;
        word        command;
        word        number;
        byte        controller;
        byte        plci;
        word        ncci;
      } header;
      union {
        _ALT_REQP           alert_req;
        _ALT_CONP           alert_con;
        ...
        _CON_B3_T90_A_RESP  connect_b3_t90_a_res;
        byte                b[200];
      } info;
    } CAPI_MSG;
    
    typedef struct CAPI_MSG::_MSG_HEADER CAPI_MSG_HEADER;
    

    MfG :xmas1:



  • Wie schon angedeutet liegt das Problem darin, dass es in C keine verschachtelten Strukturen gibt, so dass struct _MSG_HEADER (btw ist dieser Name verboten bzw. der Implementation vorbehalten, benutzerdefinierte Bezeichner dürfen nicht mit Unterstrich-Großbuchstabe anfangen) global sichtbar ist. In C++ wäre er nur als _API_MSG::_MSG_HEADER sichtbar.



  • Oh man danke Leute. Das mit dem typedef drunter hatte ich probiert. Und das mit den Doppelpunkten auch. Aber nicht in Kombination. 😃

    Schönen Dank und frohes Fest


Anmelden zum Antworten