Я смотрел в ун-традиционным способом достижения STRUCT «полиморфизм» в пре-C11 С. Допустим, у нас есть 2 структур:объединение структур, разделяющих одни и те же первые члены
struct s1 {
int var1;
char var2;
long var3;
};
struct s2 {
int var1;
char var2;
long var3;
char var4;
int var5;
};
На большинстве компиляторов, мы могли бы безопасно использовать между указателями на два, а затем получить доступ к общим первым членам, если отступы не выполняются. Однако это не стандартизованное поведение.
Теперь, я нашел следующую строку в стандарте C насколько C89:
Особая гарантия делаются для того, чтобы упростить использование союзов: Если объединение содержит несколько структур, которые разделяют общее начальная последовательность, и если объект объединения в настоящее время содержит одну из этих структур, разрешается проверять общую начальную часть любого из них. Две структуры имеют общую начальную последовательность, если соответствующие члены имеют совместимые типы для последовательности одного или нескольких начальных членов.
Он также утверждает следующее:
Указатель на накидной объекта, соответствующим образом отбрасываемой, указывает на каждый из его членов (или если член битовое поле, а затем в блок в который он проживает), и наоборот.
Теперь, если я создаю объединение этих двух структур:
union s2_polymorphic {
struct s1 base;
struct s2 derived;
};
и использовать его таким образом:
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);
Который компилируется и работает нормально, и дает на НКУ (GCC) 4.8.3 20140911, выход
ptest_s1->var1 = 1
ptest_s1->var2 = 2
Будет ли поведение корректно определено в соответствии с кавычками из приведенного выше стандарта?
Возможно, я не понимаю, что вы здесь делаете, но в примере с 'union', а не' s2' (т. Е. 'Производный') теперь не дублирует содержимое' s1'? IE не должен содержать только лишние элементы? – abligh
"* Будет ли поведение четко определено *" Я бы сказал: да. Что заставляет вас сомневаться в этом? – alk
@abligh: и я могу не понимать ваш вопрос ... Что вы подразумеваете под «содержать только лишние элементы»? – Mints97