struct internal, part of struct external



  • Is it possible to declare a struct in a file1.c, but declare only a part of the struct external in the header?
    Following example does that, but also enables the struct to be accesed outside the file1.c, which i don't want.

    file1.c:

    struct s sd;
    //Define struct sd of type struct s

    file1.h:

    struct s
    {
    //Public, must be first part of struct.
    int arr[5];

    //Private
    int var1, var2, var3;
    };
    //Declare type struct s

    extern struct s sd;
    //Declare external variable sd, imported from file1.c
    #define _sd ( (int [5])sd )
    //Make array from struct s accessible directly without having to access the //struct itself.



  • Sorry, hier nochmal auf feiner Deutsch!

    Kann man eine Struct, die in file1.c deklariert ist, über eine Headerdeklaration nur teilweise als extern deklarieren. Ich meine folgendes:
    In der Struct sind mehrere Felder, von denen aber nur eines sozusagen "public" sein soll und die anderen privat. Von extern möchte ich aber direkt ohne Umweg über Structname.irgendwas auf das "public" Feld zugreifen. In meinem Bespiel ist das gemacht, aber man hat durch die externe Deklaration im Header Zugriff auf alle Datenfelder, obwohl es eigentlich so gedacht ist, dass man nur über das Makro auf die "public" Felder zugreift.

    file1.c:

    struct s sd;
    //Definiere eine struct sd vom Typ s

    file1.h:

    struct s
    {
    //Public, muss am Anfang der Struct stehen, wegen Typecast im Headerfile
    int arr[5];

    //Private
    int var1, var2, var3;
    };
    //Deklariere Struct vom Typ s

    extern struct s sd;
    //Deklariere externe variable sd, importiert von file1.c
    #define _sd ( (int [5])sd )
    //Mache möglich, dass auf array von struct s auch von außerhalb zugegriffen werden kann ohne Umweg über "xx.yy".
    //Alternativ geht auch folgendes #define
    #define __sd ( sd.arr )



  • MC schrieb:

    Kann man eine Struct, die in file1.c deklariert ist, über eine Headerdeklaration nur teilweise als extern deklarieren.

    Nein. Wenn du sowas nachbauen willst, musst du etwas tricksen und demjenigen, dem du deine Privatdaten nicht bekanntgeben willst, per Typdefinition darüber im Unklaren lassen, d.h. hierfür einfach eine unvollständige struct vorgeben, also in etwa

    struct MeineDaten
    {
    /* Public, muss am Anfang der Struct stehen, wegen Typecast im Headerfile */
    int arr[5];
    /* Private */
    int var1, var2, var3;
    };
    

    und dann

    struct MeineDatenDieIchNachAussenGebenWill
    {
    /* Public, muss am Anfang der Struct stehen, wegen Typecast im Headerfile */
    int arr[5];
    };
    

    Sinnvollerweise sollten dann deine "Privatdaten" am Ende der struct liegen, was hier bei dir wahrscheinlich schon zufällig so war.

    Und deine Makro-Versuche lasse mal lieber sein, das sieht ja grauenvoll aus.



  • Es gibt Probleme bei Arrays. Gib doch die ganze Struktur frei und beschreibe die zusaetzlichen Felder als "reserved", "internal", oder was auch immer. Alternativ kannst du auch einen abstrakten Datentyp dem Benutzer anbieten und mittels Zugriffsfunktionen die gewuenschten Member freigeben.



  • MC schrieb:

    In der Struct sind mehrere Felder, von denen aber nur eines sozusagen "public" sein soll und die anderen privat.

    Definiere doch die Struktur static und dann machst du Funktionen bekannt, welche deine public Member bearbeiten, oder Zeiger auf diese zurückgeben.



  • Aber wie kann ich denn im file1.c und im Header dasselbe Datenobjekt Struct MeineDaten unter einem anderen Struct Typ MeineDatenDieIchBekanntGebenWill bekannt machen ? Das gibt doch einen Typkonflikt vom Linker, oder?

    Ich müsste ja dann sowas machen:

    file1.c:

    struct MeineDaten
    {
    /* Public, muss am Anfang der Struct stehen, wegen Typecast im Headerfile */
    int arr[5];
    /* Private */
    int var1, var2, var3;
    }s;
    

    Header:

    struct MeineDatenDieIchNachAussenGebenWill
    {
    /* Public, muss am Anfang der Struct stehen, wegen Typecast im Headerfile */
    int arr[5];
    }; 
    extern struct MeineDatenDieIchBekanntGebenWill s;
    

    und dann haette dasselbe Datenobjekt zwei verschiedene Typen.



  • intern sollst du ja auch casten, das war wohl so von dat wutzi gemeint



  • Rate mal, warum in C++ auch private Member in der Klassendefinition stehen. Das was du moechtest ist unueblich oder gar falsch.



  • // file1.h
    struct MeineDatenDieIchNachAussenGebenWill
    {
    	int arr[5]; // public
    };
    
    void some_function1 ( struct MeineDatenDieIchNachAussenGebenWill* p );
    struct MeineDatenDieIchNachAussenGebenWill* some_function2 ( void );
    
    // file1.c
    struct MeineDaten
    {
    	int arr[5]; // public
    	int var1, var2, var3; // private
    };
    
    struct MeineDaten blubb;
    
    struct MeineDatenDieIchNachAussenGebenWill* some_function2 ( void )
    {
    	return (MeineDatenDieIchNachAussenGebenWill*)&blubb;
    }
    
    void some_function ( struct MeineDatenDieIchNachAussenGebenWill* p )
    {
    	struct MeineDaten* pmeine_daten = (struct MeineDaten*)p;
    	pmeine_daten->var1 = 4711; // zugriff auf private member
    }
    

    das wäre m.m.n. eine eher ungewöhliche variante.
    üblich ist der weg von knivil und cjosef bzw. eine kombination von beidem,
    was spricht dagegen?


Anmelden zum Antworten