结合内部结合

时间:2012-04-24 04:04:36

标签: c unions

我正在尝试构建网络应用程序,我需要能够一次编写一个选项,一个,两个或三个。即使我只使用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

我在这里有点困惑,我怎样才能建立一个结构选择?

3 个答案:

答案 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的大小。