免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6012 | 回复: 11
打印 上一主题 下一主题

[C++] 这样的 联合体 什么意思 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-30 18:04 |只看该作者 |倒序浏览
  1. union GameID
  2. {
  3.         struct
  4.         {
  5.                 int a;
  6.                 int b;
  7.         };
  8.         int c;
  9. };
复制代码
联合体里面的 struct,又不是对象,为什么可以,不解,我觉得应该是这样的吧
  1. union GameID
  2. {
  3.         struct
  4.         {
  5.                 int a;
  6.                 int b;
  7.         }m;
  8.         int c;
  9. };
复制代码
两种经 测试都是可以的,只不过第一种 可以直接访问 a , b   第二种需要先访问m,再访问a,b
这是为什么,不解

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-08-30 18:52 |只看该作者
這就是聲明了類型吧,沒有定義任何成員

论坛徽章:
0
3 [报告]
发表于 2013-08-30 19:00 |只看该作者
第一种就是你去掉struct剩下的两种数据宽度

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
4 [报告]
发表于 2013-08-30 19:00 |只看该作者
回复 1# homerzhou


    C++中类可以由三个关健字生成class,struct,union,C++充许有不具名类以及不具名的类成员。当访问不具名类的成员时可以从最外层具名的类型处直接访问。

相关规定如下:

Unnamed classes and classes contained directly or indirectly within unnamed classes
shall not contain static data members


对于联合体的成员访问又有如下规定,由于common initial sequence所以访问的值是相同的。
If a POD-union contains two or more POD-structs that share a common initial sequence, and if the PODunion
object currently contains one of these POD-structs, it is permitted to inspect the common initial part
of any of them. Two POD-structs share a common initial sequence if corresponding members have layoutcompatible
types (and, for bit-fields, the same widths) for a sequence of one or more initial members.

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-08-30 19:07 |只看该作者
本帖最后由 myworkstation 于 2013-08-30 19:09 编辑

补充一下,VC++和gcc的"C"编译器都通过编译器扩展功能来支持unnamed union or struct。

参考:
http://gcc.gnu.org/onlinedocs/gc ... html#Unnamed-Fields
http://msdn.microsoft.com/zh-cn/ ... 8%28v=VS.80%29.aspx

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
6 [报告]
发表于 2013-08-30 21:34 |只看该作者
还是匿名的好,更加直观

论坛徽章:
0
7 [报告]
发表于 2013-09-01 14:29 |只看该作者
第二种用起来直观些

论坛徽章:
0
8 [报告]
发表于 2013-09-02 15:44 |只看该作者
union GameID
{
        struct
        {
                int a;
                int b;
        };
        int a;  // 这里也是a
};

如果匿名,能否这样定义呢? 怎么引用呢?

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
9 [报告]
发表于 2013-09-02 16:08 |只看该作者
回复 8# thomasnew


    不能这样,这样就访问a就会出现岐义(多于一个的候选名字),编译器会报错的。

论坛徽章:
0
10 [报告]
发表于 2013-09-02 16:25 |只看该作者
回复 9# myworkstation


    如果不匿名,是不是就可以两个都是 a 了?
那这样说的话,还是不匿名更灵活,更自然。按照C/C++的风格,{}就是一种namespace,应该起到隔离的作用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP