Zeigt ein Zeiger auf eine Struktur in C immer auf ihr erstes Mitglied?
Lesezeit: 3 Minuten
Steve
Angenommen, ich habe eine Reihe von C-Strukturen, für die ich einen bestimmten Satz von Funktionen verwenden möchte.
Ich frage mich, ob das Folgende ein legitimer Ansatz ist:
typedef struct Base {
int exampleMember;
// ...
} Base;
typedef struct Foo {
Base base;
// ...
} Foo;
typedef struct Bar {
Base base;
// ...
} Bar;
void MethodOperatesOnBase(void *);
void MethodOperatesOnBase(void * obj)
{
Base * base = obj;
base->exampleMember++;
}
Im Beispiel werden Sie feststellen, dass beide Strukturen Foo und Bar beginne mit a Base Mitglied.
Und das drin MethodOperatesOnBaseich werfe die void * Parameter zu Base *.
Ich möchte Hinweise auf übergeben Bar und Hinweise auf Foo zu dieser Methode und verlassen Sie sich darauf, dass das erste Mitglied der Struktur a ist Base Struktur.
Ist dies akzeptabel oder gibt es einige (möglicherweise Compiler-spezifische) Probleme, die ich beachten muss? (Zum Beispiel eine Art Pack-/Padding-Schema, das die Position des ersten Mitglieds einer Struktur ändern würde?)
Gibt es einen Grund, warum Sie nicht nur C++ verwenden?
– Jonathan Grynspan
5. September 2011 um 20:43 Uhr
Ja. Aber Punkt gut getroffen. Ich versuche, einen supereinfachen Vererbungsmechanismus für eine begrenzte Anzahl von Strukturen in meinem Projekt zu imitieren.
– Steve
5. September 2011 um 20:46 Uhr
Ich verstehe, was Sie sagen, aber ich kann nicht für dieses Projekt.
– Steve
5. September 2011 um 20:51 Uhr
Is this homework? Ich war 10 Jahre lang nicht in der Schule, aber danke. LOL
– Steve
5. September 2011 um 20:53 Uhr
@Jonathan Grynspan: Das ist eine berechtigte Frage. Angenommen, Ihr Programm ist 10.000 Zeilen lang und in C geschrieben. Dann haben Sie ungefähr 100 Zeilen, in denen Sie dieses Struktur-Wortspiel durchführen müssen. In diesem Fall lohnt es sich wahrscheinlich, etwas mehr Aufwand zu betreiben, um das gesamte Programm in C kompatibel zu halten.
– Mystisch
5. September 2011 um 21:04 Uhr
hmakholm hat Monica übrig gelassen
Ja, die C-Norm garantiert ausdrücklich, dass dies funktioniert.
(C1x §6.7.2.1.13: „Ein Zeiger auf ein Strukturobjekt, geeignet konvertiert, zeigt auf sein Anfangselement … und umgekehrt. Es kann unbenannte Auffüllung innerhalb eines Strukturobjekts geben, aber nicht an seinem Anfang.“)
@MByD: Die Standards selbst sind aus dummen Urheberrechtsgründen nicht verlinkbar, aber Google kann mehrere Entwürfe für Sie finden.
Ich widerspreche keiner der Antworten, die sagen, dass das, was Sie vorgeschlagen haben, funktionieren wird, aber im Interesse einer vollständigeren Diskussion (ohne vorzuschlagen, dass Sie C ++ verwenden!), Warum nicht so etwas tun?
typedef struct Base ... /* The types defined exactly as before */
typedef struct Foo ...
typedef struct Bar ...
/* The function takes a Base* since that is what it actually works with*/
void MethodOperatesOnBase(Base* pbase)
{
/* Do something... */
}
/* Now call it like this: */
Foo foo;
Bar bar;
MethodOperatesOnBase(&foo.base);
MethodOperatesOnBase(&bar.base);
Gibt es einen Grund, der nicht funktioniert und Sie verwenden müssen void *? Ich sehe nicht, dass dies viel mehr Arbeit ist und den Vorteil der Typsicherheit hat.
Nun, in meinem speziellen Fall ist der Grund, weil Foo und Bar werden als undurchsichtige Zeiger exponiert.
– Steve
5. September 2011 um 21:39 Uhr
@Steve: OK, der Anrufer kann also nicht auf die verweisen base Mitglied und Sie müssen dies tun, indem Sie den Strukturzeiger neu interpretieren. Das macht Sinn, danke für die Klarstellung.
– AAT
5. September 2011 um 21:48 Uhr
13845700cookie-checkZeigt ein Zeiger auf eine Struktur in C immer auf ihr erstes Mitglied?yes
Gibt es einen Grund, warum Sie nicht nur C++ verwenden?
– Jonathan Grynspan
5. September 2011 um 20:43 Uhr
Ja. Aber Punkt gut getroffen. Ich versuche, einen supereinfachen Vererbungsmechanismus für eine begrenzte Anzahl von Strukturen in meinem Projekt zu imitieren.
– Steve
5. September 2011 um 20:46 Uhr
Ich verstehe, was Sie sagen, aber ich kann nicht für dieses Projekt.
– Steve
5. September 2011 um 20:51 Uhr
Is this homework?
Ich war 10 Jahre lang nicht in der Schule, aber danke. LOL– Steve
5. September 2011 um 20:53 Uhr
@Jonathan Grynspan: Das ist eine berechtigte Frage. Angenommen, Ihr Programm ist 10.000 Zeilen lang und in C geschrieben. Dann haben Sie ungefähr 100 Zeilen, in denen Sie dieses Struktur-Wortspiel durchführen müssen. In diesem Fall lohnt es sich wahrscheinlich, etwas mehr Aufwand zu betreiben, um das gesamte Programm in C kompatibel zu halten.
– Mystisch
5. September 2011 um 21:04 Uhr