3

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

我在这里有点困惑,我该如何构建结构的选择?

4

3 回答 3

4

一个联合与其最大的成员一样大,因为它必须能够随时存储最大的成员。在这种情况下,您有struct three两个数组,每个数组包含两个字符,总共四个字符,因此任何实例的choice长度都是四个字符。

于 2012-04-24T05:10:42.343 回答
3

联合对您根本没有帮助,而是混淆了代码并增加了插入不需要的填充字节的机会。相反,这样做:

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;
}
于 2012-04-24T06:24:31.427 回答
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.

于 2012-04-24T11:23:43.097 回答