我正在尝试构建网络应用程序,我需要能够一次编写一个选项,一个,两个或三个。即使我只使用struct one,下面的联合也会将4个字符写入网络。
union choice_
{
struct one_
{
unsigned char one[2];
}src;
struct two_
{
unsigned char two[2];
}two;
struct three
{
unsigned char one[2];
unsigned char two[2];
}three;
}choice;
我不能只写一个choice.one
我在这里有点困惑,我怎样才能建立一个结构选择?
答案 0 :(得分:4)
联盟与其最大的成员一样大,因为它必须能够随时存储最大的成员。在这种情况下,你有struct three
,其中包含两个数组,每个数组包含两个字符,总共四个字符,因此任何choice
的实例都将是四个字符长。
答案 1 :(得分:3)
union根本没有帮助你,而是混淆代码并增加插入不需要的填充字节的机会。相反,这样做:
typedef struct
{
char data[2];
} choice_t;
...
void write_bytes_to_network (const choice_t* choice);
...
choice_t one = ...;
choice_t two = ...;
switch(something)
{
case 1:
write_bytes_to_network (&one);
break;
case 2:
write_bytes_to_network (&two);
break;
case 3:
write_bytes_to_network (&one);
write_bytes_to_network (&two);
break;
}
答案 2 :(得分:0)
你可以:
union choice_ u;
...
write(<fd>, u.one, sizeof(u.one));
或者如果它是两个
union choice_ u;
...
write(<fd>, u.two, sizeof(u.two));
或在第三种情况下
union choice_ u;
...
write(<fd>, u.three, sizeof(u.three));
但请注意,在您的情况下sizeof(union choice_)
将始终等于struct three
的大小。