C header nutzt class Schlüsselwort (oder: wie C mich umbringt)

  • Für das UPnP/DLNA-Plugin hab ich mir libdlna-dev installiert. Der header definiert die Profilstruktur:


    Code
    typedef struct dlna_profile_s {
      /* Profile ID, part of DLNA.ORG_PN= string */
      const char *id;
      /* Profile MIME type */
      const char *mime;
      /* Profile Label */
      const char *label;
      /* Profile type: IMAGE / AUDIO / AV */
      dlna_media_class_t class;
    } dlna_profile_t;


    wie man sehen kann nutzt die Struktur das Schüsselwort "class". Wenn ich nun mit g++ meine Quelltexte kompilieren will bekomme ich wegen den includes an dieser Stelle einen Fehler weil ja keine Klasse deklariert wird.


    ich habe schon das hier versucht:


    Code
    #ifdef __cplusplus
    extern "C" {
        #include <dlna.h>
    }
    #endif


    ohne Erfolg. Wie löse ich das Problem?


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

    Einmal editiert, zuletzt von methodus ()

  • ... so hier:


    Code
    #ifdef __cplusplus
    extern "C" {
      #define class _class
      #include <dlna.h>
      #undef class
    }
    #endif


    Dreckig. Aber lässt sich jetzt kompilieren. Wer noch ne Lösung hat: her damit!


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Zitat

    Original von methodus
    ... so hier:


    Code
    #ifdef __cplusplus
    extern "C" {
      #define class _class
      #include <dlna.h>
      #undef class
    }
    #endif


    Dreckig. Aber lässt sich jetzt kompilieren. Wer noch ne Lösung hat: her damit!


    kompilieren wird es nicht, da so aus


    dlna_media_class_t class;
    dlna_media__class_t _class


    wird und somit der Typ nicht mehr passt.

  • Zitat

    Original von methodus
    ... so hier:


    Code
    #ifdef __cplusplus
    extern "C" {
      #define class _class
      #include <dlna.h>
      #undef class
    }
    #endif


    Dreckig. Aber lässt sich jetzt kompilieren. Wer noch ne Lösung hat: her damit!


    Ich finde das schon in Ordnung so. Nur für den Fall, dass du selber mal auf class zugreifen musst, würde ich den #undef weglassen. Das extern "C" {} verhindert nur das Name-Mangling, das hilft dir hier nicht.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Das geht leider nicht, wenn ich das #undef rausnehme, werden mir im Rest des Quellextes alle class-definitionen durch _class ersetzen und schmeißt fehler. Ansonsten bleibt der Zugriff über _class ja erhalten. Muss halt nur immer sehen, wie es im Moment definiert ist.


    an mdre: nein, er ersetzt nur die schlüsselwörter und nicht irgendwo mittendrin. Sonst würden Makros komplett alles ersetzen, was so heißt wie das Makro.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

    Einmal editiert, zuletzt von methodus ()

  • Zitat

    Original von methodus
    Das geht leider nicht, wenn ich das #undef rausnehme, werden mir im Rest des Quellextes alle class-definitionen durch _class ersetzen und schmeißt fehler. Ansonsten bleibt der Zugriff über _class ja erhalten. Muss halt nur immer sehen, wie es im Moment definiert ist.


    Na klar, du hast natürlich recht.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ich habe ein neues Problem:


    Für die Callbackmethode get_info des webservers von libupnp habe ich folgende statische methode geschrieben:


    Code
    WebServer::getInfo(const char* filename, File_Info* info){
    ...


    ich möchte die C-Struktur File_Info befüllen und habe folgenden Code:



    die erste Zeile habe ich >>erstmal<< auskommentiert, da ich mir nicht sicher bin, ob ich den speicher reservieren muss oder nicht.


    Die ganzen Informationen, die mit MESSAGE ausgegeben werden sollen, funktionieren problemlos, allerdings spinnt der webserver rum und liest die daten offensichtlich nicht korrekt aus. Wenn ich die erste Zeile auskommentiert lasse, glaubt der webserver info->is_directory steht auf 0, egal ob es tatsächlich 1 ist. Nehme ich die Zeile wieder rein, funktioniert info->is_directory, dafür aber info->is_readable nicht mehr und zeigt das selbe phänomen. ich vermute es mangelt an einer korrekten initialisierung der Struktur.


    Meine Frage ist nun, wie ich die Struktur korrekt befülle, so dass die lib die Daten richtig ausliest?


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • ich habe mir jetzt mal die libupnp neu aufgesetzt und die struktur ausgeben lassen, wo sehr deutlich wird, dass etwas nicht stimmt:


    file info: ýý, length: 5342769179684503551, last_mod=Thu Jan 1 00:00:00 1970
    readable=147210984


    hier sollte eigentlich stehen
    file info: ZDF, length: -1, last_mod=<aktuelles Datum>
    readable=1


    Aber es kommt eben nur dieser uninitialisierte Dreck. Kann es sein, dass C++ die Struktur nicht initialisiert?



    //edit:


    Neues vom Phänomen:


    Wenn ich info->is_directory ändere, wird last_modified geändert. Ändere ich is_readable, ändert sich is_directory.


    Ich habe vorher alle Werte mit 0 initialisiert, was auch funktioniert. Vielleicht wäre noch wichtig, dass die Struktur diesen aufbau hat:



    Der mehr oder minder einzige Wert, der bis jetzt ordentlich funktioniert ist file_lenght.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

    Einmal editiert, zuletzt von methodus ()

  • Ich habe jetzt noch die Addressen dazu ausgeben lassen und bin gnadenlos überfragt, was da schief läuft:


    Werte sind:
    Size = -1
    CT = NULL
    DIR = 0
    READ = 1
    Mod = 0


    Die selbstgeschriebene Ausgabe:


    Size: -1 0xb30fa088
    CT : (null) 0xb30fa098
    DIR : 0 0xb30fa090
    READ: 1 0xb30fa094
    Mod.: 0 0xb30fa08c


    und nun die der libupnp:


    length: 4294967295 0xb30fa088
    last_mod=0 0xb30fa090
    readable=0 0xb30fa098
    directory=1 0xb30fa094
    content-type=(null) 0xb30fa09c


    Es ist haargenau die gleiche Struktur, da ich einen Zeiger auf die Struktur erhalte und die Werte direkt in die Felder eintrage. HILFE!!!


    //edit: sizeof(File_Info) in der libupnp hat 24 Byte und im C++-Quelltext nur 20 Byte. Es fehlen 4 Byte! :schiel


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

    Einmal editiert, zuletzt von methodus ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!