Я программирую в linux, что является новым для меня. Я работаю над проектом по разработке сетевого протокола уровня 7, и у нас есть эти пакеты, которые содержат ресурсы. И в зависимости от типа ресурса длина этого ресурса будет отличаться. Я как бы новичок в C/C++, и я не уверен, что хорошо понимаю профсоюзы. Идея заключалась в том, что я мог бы создать тип «общего ресурса», и в зависимости от того, какой ресурс я мог бы просто наложить void * в качестве указателя на эту структуру typedef, а затем вызвать содержащиеся в нем данные как угодно, он позаботится о «кастинге». В любом случае, вот что я придумал:(C/C++) Структуры, содержащие союзы, содержащие структуры ...?
typedef struct _pktresource
{
unsigned char Type; // The type of the resource.
union {
struct { // This is used for variable length data.
unsigned short Size;
void *Data;
};
void *ResourceData; // Just a generic pointer to the data.
unsigned char Byte;
char SByte;
short Int16;
unsigned short UInt16;
int Int32;
unsigned int UInt32;
long long Int64;
unsigned long long UInt64;
float Float;
double Double;
unsigned int Time;
};
} pktresource, *ppktresource;
Принципал, стоящий за этим, был прост. Но когда я делаю что-то вроде
pktresource.Size = XXXX
Он начинается с 4 байтов в структуре вместо 1 байта. Неужели я не могу понять основную концепцию здесь? Потому что мне кажется.
EDIT: Забыл упомянуть, когда я ссылаться
pktresource.Type
Он начинается с самого начала, как его предполагается.
EDIT: Исправление должно было добавлять утверждения прагмы для правильного выравнивания. После исправления, код выглядит следующим образом:
#pragma pack(push)
#pragma pack(1)
typedef struct _pktresource
{
unsigned char Type; // The type of the resource.
union {
struct { // This is used for variable length data.
unsigned short Size;
unsigned char Data[];
};
unsigned char ResourceData[]; // Just a generic pointer to the data.
unsigned char Byte;
char SByte;
short Int16;
unsigned short UInt16;
int Int32;
unsigned int UInt32;
long long Int64;
unsigned long long UInt64;
float Float;
double Double;
unsigned int Time;
};
} pktresource, *ppktresource;
#pragma pack(pop)
«Я программирую в linux, что для меня ново.», «Я как бы новичок в C/C++», - и вы пишете сетевой протокол ???? –
Я не новичок в создании сетей или в программировании или в самом Linux. Я программировал на окнах на одном или другом языке около 13 лет. Вы знаете ответ на мой вопрос, или вы просто сказали это по-настоящему? –
«Я программировал окна на одном или другом языке уже около 13 лет» - и все же вы новичок в C/C++. На каких языках вы использовали? –