Задалбался с M$ стилем оформления версионности(и р3 и р0)..... Они делают типа так: Код (Text): #if (build==98) typedef _core { int a1; }CORE,*PCORE; #endif #if (build==2000) typedef _core { int a1; int a2; }CORE,*PCORE; #endif #if (build==XP) typedef _core { int a1; int a2; int a3; }CORE,*PCORE; #endif а чтобы своя прога была универсальной т.е. в зависимости от версии использовала или что-то не использовала приходится руками эти творения конвертировать в Код (Text): typedef struct _core98 { int a1; }_CORE98,*PCORE98; typedef struct _core2000 { int a1; int a2; }_CORE2000,*PCORE2000; typedef truct _corexp { int a1; int a2; int a3; }_COREXP,*PCOREXP; #if (build==98) typedef _core98 CORE,*PCORE; #endif #if (build==2000) typedef _core2000 CORE,*PCORE; #endif #if (build==__XP__) typedef _corexp CORE,*PCORE; #endif Видит ли кто в моём способе какие минусы?? Кроме плюса - иметь возможность в программе все варианты версий структур и динамически ими пользоваться...
Тогда уж Код (Text): struct core { int a1; }; struct core2k: core { int a2; }; struct corexp: core2k { int a3; }; Если там действительно идёт расширение структур. А если замена — тогда сложнее, но всё равно через наследование проще.
IceStudent Да Ваш вариант тоже интересный! Но он под срр ,а не под чистый ся, т.е. менее универсальный в смысле безтюнинговых подключений в чистый ся проект. А так сам тоже люблю ООП Спасибо!
Чистый си? Тоже можно (по стопам ms): Код (Text): struct core {}; struct corexp { core head; int a2; }; struct core2k3 { core head; int a2; int a3; };
IceStudent Вот уж лучше Вы своими стопами - они у Вас заметно лучше! А по ихнем стопам получаются семантические коллизии.... т.е. получается надо будет вносить изменения в основной начальный вариант доступа к CORE если билд выше 98 т.к. появилось дополнительное промежуточное поле(типа head)... А наши первые варианты(мой(с) и Ваш(срр)) пристёгиваются к ранее написанной программе прозрачно - без вноса изменений Спасибо!