user-0 提问: 结构里的联合，可以省掉联合的名字吗？

回复:
user: user-1
content: 引用 7 楼 lm_whales 的回复:C++ struct 其实可以和class一样。 可以定义 构造函数，析构函数，静态成员变量和函数， 可以定义私有，公有，或者保护成员变量和函数 可以继承，被继承 C++ union 据说也可以定义的跟 class 一样， 而且成员也不限于内部类型，以及内部类型组成C式样的 struct C 式样的 union  的组合 这种其实跟 这里讨论的无名结构，联合无关，可以忽略  无名结构或者联合并且没有定义变量，也没有用typedef 定义别名 则 它定义的变量，相当于在他的外部作用域定义的同名变量。 只是存储上，受到 结构或者联合 的影响，不属于自由定义的变量  自由定义的变量，存储不受任何限制， 编译器可以不必安排连续区域存储。  结构或者联合内部定义的变量，受结构或者联合的约束  早期的C似乎不支持，无名结构 C99,C11 不知道支持不 C11 有 匿名struct和union C++只有匿名union  不过一般编译器都支持匿名struct和union

user: user-2
content: 理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 一个很现实的问题，如果没有名字，你如何去使用联合里的数据元素，如何赋值或者获取联合里的数据元素；

user: user-4
content: 引用 10 楼 akirya 的回复:[quote=引用 7 楼 lm_whales 的回复:] 。。。。 C11 有 匿名struct和union C++只有匿名union  不过一般编译器都支持匿名struct和union[/quote]  就是说C新标准已经支持了，C++ 标准还是犹抱琵琶半遮面 虽然C++出来以后，通常 C标准，显然不如C++标准更有执行力 但实际上，各大编译器 在这个问题上，匿名 struct,union 已经是事实上标准了  C++标准，不如顺水推舟，来得更好。。。。。。。。。

user: user-4
content: C++ struct 其实可以和class一样。 可以定义 构造函数，析构函数，静态成员变量和函数， 可以定义私有，公有，或者保护成员变量和函数 可以继承，被继承 C++ union 据说也可以定义的跟 class 一样， 而且成员也不限于内部类型，以及内部类型组成C式样的 struct C 式样的 union  的组合 这种其实跟 这里讨论的无名结构，联合无关，可以忽略  无名结构或者联合并且没有定义变量，也没有用typedef 定义别名 则 它定义的变量，相当于在他的外部作用域定义的同名变量。 只是存储上，受到 结构或者联合 的影响，不属于自由定义的变量  自由定义的变量，存储不受任何限制， 编译器可以不必安排连续区域存储。  结构或者联合内部定义的变量，受结构或者联合的约束  早期的C似乎不支持，无名结构 C99,C11 不知道支持不

user: user-4
content: struct {         int a;         union         {                 struct                 {                         int x;                         int y;                  }log;                    struct                 {                         int m;                         int n;                  }chat;      }; }send;  这个定义 log 和 chat 在同一位置 因此 log.x ,chat.m 也就在同一位置了         log.y，chat .n 也就在同一位置了 注意，这两个结构没有名字，但定义了变量，所以 x,m 这两名名字，必须要跟 log,chat 这两个名字联系起来，才可以 不能单独用   union 没有名字 所以 log，chat 这两个名字，可以算作 send 的一个成员。只是他们是 union定义的，所以共用同一块内存 同样， 最外层的stuct 没有名字 因此，这个结构定义是一次性的 除了定义 send 这个变量外，别无作用了，不能再拿来定义别的变量了。

user: user-4
content: 2）内层为的结构，联合，不定义变量，且没有名字

user: user-5
content: 当然在同一个位置, log 和chat 的结构完全相同,又使用同一块内存

user: user-0
content: 引用 2 楼 lm_whales 的回复:都可以，类，结构，联合 内部定义的结构，联合都可以没有名字 没有名字分两种情况 1）同时定义变量（1～n个,也可以定义数组） 2）内成为南方的结构，联合，不定义变量，且没有名字 3) typdef 为没有名字的类型，定义一个名字 第一种情况，这个匿名类型定义的变量，就是外层 类结构，联合的成员。内层的结构，联合 都不能定义变量，因为没有名字。  第二种情况。这个匿名类型，是外层类型的一部分，他的成员，就是外部类型的成员 如果外层为联合， 内层为结构 则结构视为一个整体， 他的成员，并不具有，联合成员的共享内存特性。  第三种情况，实际上，给结构联合起个别名 成员，跟外围类型无关。可以用别名定义对象。，，，， C这么做不很合适，因为C没有作用域运算符，不能在外部，找到内部typedef 定义的别名。  那么请问，假如我定义这样的：  struct {         int a;         union         {                 struct                 {                         int x;                         int y;                  }log;                    struct                 {                         int m;                         int n;                  }chat;      }; }send;  变量x和m是存储在同一位置吗？

user: user-4
content: 都可以，类，结构，联合 内部定义的结构，联合都可以没有名字 没有名字分两种情况 1）同时定义变量（1～n个,也可以定义数组） 2）内成为南方的结构，联合，不定义变量，且没有名字 3) typdef 为没有名字的类型，定义一个名字 第一种情况，这个匿名类型定义的变量，就是外层 类结构，联合的成员。内层的结构，联合 都不能定义变量，因为没有名字。  第二种情况。这个匿名类型，是外层类型的一部分，他的成员，就是外部类型的成员 如果外层为联合， 内层为结构 则结构视为一个整体， 他的成员，并不具有，联合成员的共享内存特性。  第三种情况，实际上，给结构联合起个别名 成员，跟外围类型无关。可以用别名定义对象。，，，， C这么做不很合适，因为C没有作用域运算符，不能在外部，找到内部typedef 定义的别名。

user: user-6
content: 这样的匿名类不是太标准，所以建议不要这样，不过不少编译器都支持了，所以实地测试一下编译器支持情况就行了.