У меня есть вопрос о C и попытка издеваться над частичным типом «наследования», только при доступе к членам структур. Посмотрите на следующий пример:Отказывающееся «наследование» при доступе к элементам структур в C
#pragma pack(push,1)
typedef struct foo
{
int value;
int value2;
}foo;
typedef struct foo_extended
{
// "inherits" foo
int value;
int value2;
// "inherits" foo stops
//we also have some additional data
float additional;
}foo_extended;
#pragma pack(pop)
//! This function works for both foo types
void workboth(void* objP)
{
foo* obj = (foo*)objP;
obj->value = 5;
obj->value2 = 15;
}
//! This works only for the extended
void workextended(foo_extended* obj)
{
obj->value = 25;
obj->value2 = 35;
obj->additional = 3.14;
}
int main()
{
foo a;
foo_extended b;
workboth(&a);
workboth(&b);
workextended(&b);
return 0;
}
Это работает в моей системе, но мой вопрос, может ли это быть портативными, пока есть правильная упаковка вовлеченных структур (в зависимости от компилятора). Полагаю, для этого нужно было бы #ifndefs корректно использовать плотную упаковку в других компиляторах.
Конечно, очевидная проблема - полное отсутствие проверки типа и возложение всей ответственности за правильное использование программиста, но мне интересно, переносимо это или нет. Благодаря!
P.S .: Забыл упомянуть, что стандарт я стараюсь придерживаться является C99
Спасибо. Это отвечает на мой вопрос, так как я хочу быть совместимым с C99. Забыл упомянуть об этом в моем вопросе – Lefteris
Хм, я не вижу, как вы делаете свое заключение из текста, который вы цитируете. Это только гарантирует, что их порядок будет одинаковым и что выравнивание подходит для типа. Он ничего не говорит о том, что внутреннее заполнение 'foo' может не измениться, если разные поля отличаются. –
Да, конечно @JensGustedt. Но реализация должна быть активно программиста недружелюбной, чтобы иметь разные детали реализации для структур, скажем, с помощью 2 или 3 menbers ... – pmg