Ich habe in eine nicht traditionelle Art und Weise der Suche Struktur „Polymorphismus“ in pre-C11 C. Angenommen, wir haben zwei Strukturen zu erreichen:Vereinigung von structs teilt gleiche erste Mitglieder
struct s1 {
int var1;
char var2;
long var3;
};
struct s2 {
int var1;
char var2;
long var3;
char var4;
int var5;
};
Auf den meisten Compiler, Wir könnten sicher zwischen den Zeigern zu den beiden umwandeln und dann auf die gemeinsamen ersten Mitglieder zugreifen, wenn keine Auffüllung stattfindet. Dies ist jedoch kein standardisiertes Verhalten.
Nun fand ich die folgende Zeile in der C-Standard bis C89:
Eine besondere Garantie wird gemacht, um die Verwendung von Gewerkschaften zu vereinfachen: Wenn ein Zusammenschluss mehrere Strukturen enthält, die eine gemeinsame teilen Anfangsfolge, und wenn das Vereinigungsobjekt gegenwärtig eine dieser Strukturen enthält, ist es erlaubt, den gemeinsamen Anfangsteil von jedem von ihnen zu untersuchen. Zwei Strukturen teilen eine gemeinsame Anfangssequenz, wenn entsprechende Mitglieder kompatible Typen für eine Sequenz von einem oder mehreren Anfangselementen haben.
Weiter heißt es, die folgend:
Ein Zeiger auf ein Objekt Union, in geeigneter Weise gegossen, um jedes ihrer Mitglieder Punkte (oder wenn ein Mitglied ist, ein Bit-Feld, dann an die Einheit in wo es sich befindet) und umgekehrt.
Nun, wenn ich eine Vereinigung dieser beiden structs:
union s2_polymorphic {
struct s1 base;
struct s2 derived;
};
Und es auf diese Weise verwenden:
union s2_polymorphic test_s2_polymorphic, *ptest_s2_polymorphic;
struct s2 *ptest_s2;
struct s1 *ptest_s1;
ptest_s2_polymorphic = &test_s2_polymorphic;
ptest_s2 = (struct s2*)ptest_s2_polymorphic;
ptest_s2->var1 = 1;
ptest_s2->var2 = '2';
ptest_s1 = (struct s1*)ptest_s2;
printf("ptest_s1->var1 = %d\n", ptest_s1->var1);
printf("ptest_s1->var2 = %c\n", ptest_s1->var2);
Welche kompiliert und läuft gut und gibt, auf gcc (GCC) 4.8.3 20140911, der Ausgang
ptest_s1->var1 = 1
ptest_s1->var2 = 2
Wird das Verhalten wohldefiniert sein, entsprechend den Zitaten aus dem oben angegebenen Standard?
Ich mag falsch verstehen, was Sie hier tun, aber in dem Beispiel mit der "Union" sollte nicht "s2" (d. H. "Abgeleitet") jetzt nicht den Inhalt von "s1" duplizieren? IE sollte es nicht nur die zusätzlichen Elemente enthalten? – abligh
"* Wird das Verhalten klar definiert sein *" Ich würde sagen: Ja. Was lässt dich daran zweifeln? – alk
@abligh: und ich mag deine Frage falsch verstehen ... Was meinst du mit "nur die zusätzlichen Elemente enthalten"? – Mints97