Struct member verstecken
-
cooky451 schrieb:
Das würde gehen, wenn du den Typen nur deklarierst. Dann kannst du aber keine Instanz auf dem Stack erstellen, und bräuchtest noch eine "creator" Funktion.
problem ist, dass ich ein paar structs hab, die auf den stack müssen und die hätt ich auch gern verpackt, fällt da keinem was ein
cooky451 schrieb:
Sinnvoll finde ich das nicht.
das ist aber nicht thema
-
_-- schrieb:
problem ist, dass ich ein paar structs hab, die auf den stack müssen
Warum?
-
cooky451 schrieb:
_-- schrieb:
problem ist, dass ich ein paar structs hab, die auf den stack müssen)
Warum?
z.b. weil nur ein int drin ist und sich das über ein malloc zu holen, wär etwas übertrieben. ich bin schon bereit für eine bessere wartbarkeit, sicherheit und einfachheit geschwindigkeitseinbußen hinzunehmen, aber das muss sich dann echt in grenzen halten.
-
Ist dies ein Ansatz nach deinem Geschmack? Die Zugriffe darauf sollten zur Compilezeit optimierbar sein.
typedef struct { char data[2 * sizeof(int)]; } x_t;
Ich schätze auch, dass du die Einbußen durch cooky451s Pimpl etwas überschätzt. Die Erstellung wird zwar lange dauern, aber beim Zugriff macht eine einzelne Indirektion nicht so schrecklich viel aus, besonders bei vielen aufeinanderfolgenden Zugriffen. Würde ich mal nachmessen.
-
SeppJ schrieb:
Ist dies ein Ansatz nach deinem Geschmack?
das schaut schon ganz heiß aus, teste das später wenn ich wieder da bin
-
SeppJ schrieb:
typedef struct { char data[sizeof(x_t)]; } public_x_t;
müsste natürlich dann so sein, dass mir das evtl. padding nichts zerhaut, aber ich denke die richtung stimmt...
@edit aber dann muss x_t wieder bekannt sein? verzwickte kiste
-
Padding ist hier kein Problem, aber @SeppJ wie sieht's denn mit Alignment aus?
-
cooky451 schrieb:
Padding ist hier kein Problem, aber @SeppJ wie sieht's denn mit Alignment aus?
haarspalterei... wenn die member aligned werden wird ein padding benötigt und das bringt dann die probleme wenn man es nicht eingerechnet. sowas von hand zu machen, da bau ich mir ja einen ganzen zoo voll bugs ein
-
Wo seht ihr da Probleme mit Alignment oder Padding? Ihr seid als Programmierer voll selbst verantwortlich, zumindest habe ich mir das so gedacht. Ihr müsst selber die Daten ausrichten. Wenn ihr das char-Array an sich noch sicher ausgerichtet haben möchtet, dann nehmt ein long-Array.
-
Du kannst deine "geheimen" Felder ans Ende der Struktur legen und an die Abnehmer dann für die Abnehmer eine zweite, kleinere Struktur dokumentieren:
typedef struct { char a[102]; } Privat; typedef struct { char a[100]; } Uebergabe;
bzw. bei unterschiedlichen Feldtypen entsprechend:
typedef struct { int i; double d; char geheim; } Privat; typedef struct { int i; double d; } Uebergabe;
Den Speicherbereich für die Daten musst du natürlich im Geheimmodul definieren und bei der Übergabe/Übernahme auch nur in diesem Modul entsprechend casten und nur mit Zeigern auf diese Strukturdaten arbeiten.
-
Womöglich etwas in dieser Art:
/* foo.h */ #ifndef I_AM_FOO #define FOO_PRIVATE(x) x #else #define FOO_PRIVATE(x) do_not_use_directly_ ## x #endif struct foo { int FOO_PRIVATE(x); }; /* foo.c */ #define I_AM_FOO #include "foo.h" /* alles_andere.c */ #include "foo.h"
?
-
Musst du denn um jeden Preis C benutzen?
-
eig. solls mich selbst daran hindern aus bequemlichkeit direkt die member zu verwenden.
Baue dir ein Kompilerplugin, dass dir immer Stromstoesse gibt bei solchem Code. Alle anderen Spielchen mit char[..] sind kacke.
-
dot schrieb:
Musst du denn um jeden Preis C benutzen?
da ich eh fast alles umschreib, hab ich mir die frage auch schon gestellt, aber ich kann doch nichts anderes
denke ich werde eine mischung aus seldon und SeppJ variante verwenden. da das sowieso durch ein kleines php script läuft, werde ich versuchen die struct größen 'auszulesen' und automatisch zu setzen, falls das nicht geht, lass ich es bleiben.
-
_-- schrieb:
dot schrieb:
Musst du denn um jeden Preis C benutzen?
da ich eh fast alles umschreib, hab ich mir die frage auch schon gestellt, aber ich kann doch nichts anderes
Bedenke dabei auch, dass du C und C++ Code statisch linken kannst.
-
dot schrieb:
_-- schrieb:
dot schrieb:
Musst du denn um jeden Preis C benutzen?
da ich eh fast alles umschreib, hab ich mir die frage auch schon gestellt, aber ich kann doch nichts anderes
Bedenke dabei auch, dass du C und C++ Code statisch linken kannst.
ja, aber was soll mir das jetzt sagen