union myUnion
{
struct myStruct
{
int a;
int b;
};
}
struct внутри union
Код:
С какой целью и для чего нужно делать вот такую обертку структуры в union?
Ну а насчёт конкретной приведенной конструкции, то, как часто твердят в рекламе, 2 по цене 1, ну в нашем случае, переменных 2 а занимают памяти как 1.
Код:
union
{
int value;
unsigned char bytes[4];
}
{
int value;
unsigned char bytes[4];
}
Код:
union
{
struct
{
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned data: 29;
} bites;
unsigned raw;
}
{
struct
{
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned data: 29;
} bites;
unsigned raw;
}
В MSDN объявлена вот такая структура:
Код:
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
};
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
};
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
Вопрос: зачем в середине union внутри у которого struct? Почему не сразу struct? В чем разница?
Код:
union{
struct{
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
}
struct{
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
}
Доступ к частям указателя Pointer
Цитата: Нездешний
Доступ к частям указателя Pointer
А вот кстати,разве PVOID занимает 2 двойных слова?Что-то мне так не кажется
а OffsetHigh намекает, что это актуально для 64 разрядной системы ;)
ЗЫ
хотя могу ошибаться
PPS
Да и вообще, чего гадать-то. В описании структуры OVERLAPPED в MSDN все сказано:
[QUOTE=MSDN]The Offset and OffsetHigh members together represent a 64-bit file position. [/QUOTE]
Делать union-ом смещение до чего либо и указатель на это же самое - обычная практика; например, когда считывается какая-то структура из файла, в файле это смещение. После прочтения ко всем смещениям прибавляется адрес буфера, куда она прочитана, и автоматически получаются указатели, ну, просто же как a + b... Зато не надо делать несколько разных структур.