如何在此处为union内部的struct赋值?

时间:2013-07-09 19:42:05

标签: c++ visual-studio-2012 struct unions

#include <iostream>
#include <stdint.h>
using namespace std;

union ipv4 {
    struct bytes{
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;
    } bytes;
    uint32_t int32;
};

int main( int argc, char ** argv ) {
    union ipv4 addr;
    addr.bytes = { 192, 168, 0, 96 };
    printf("%d.%d.%d.%d - (%08x)\n",
            addr.bytes.a, addr.bytes.b, addr.bytes.c, addr.bytes.d,
            addr.int32);
    getchar();
    return 0;
}

错误:c:\ users \ yayun.xie \ documents \ satmap \ c ++ onlinematerial \ exercise files \ chap05 \ union.cpp(18):error C2059:语法错误:'{';

1 个答案:

答案 0 :(得分:1)

如果你输出结构声明不合并,你可以写这样的代码(这个片段使用复合文字,这是C99的功能C ++禁止)

struct bytes_t {
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint8_t d;
};

union ipv4 {
    bytes_t bytes;
    uint32_t int32;
};
....
    addr.bytes = (bytes_t){ 192, 168, 0, 96 };

或者,您也可以逐个分配字段。

addr.bytes.a = 192;
addr.bytes.b = 168;
addr.bytes.c = 0;
addr.bytes.d = 96;

或者,与声明初始化

一起进行
ipv4 addr = { .bytes = { 192, 168, 0, 96 } };

bytes是第一个联合字段,因此您可以退出.bytes =并只写

ipv4 addr = { { 192, 168, 0, 96 } };

使用C ++ 11的扩展初始化列表,这也是有效的:

addr.bytes = { 192, 168, 0, 96 };

顺便说一下,您忘记加入stdio.h以使用printf()getchar()