免费注册 查看新帖 |

Chinaunix

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

[C] 呼唤标准达人,关于结构体中union成员的初始化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 10:47 |只看该作者 |倒序浏览
  1. struct strA {
  2.         int a;
  3.         union {
  4.                 char c;
  5.                 int b;
  6.         }
  7. };

  8. void foo(int n) {
  9.         struct strA s = {
  10.                 .a = n,
  11.                 .c = 'a'
  12.         };
  13. }
复制代码
以上代码在gcc 4.4.4下编译会出错,需要改成以下:
  1. struct strA {
  2.         int a;
  3.         union {
  4.                 char c;
  5.                 int b;
  6.         } u;
  7. };

  8. void foo(int n) {
  9.         struct strA s = {
  10.                 .a = n,
  11.                 .u.c = 'a'
  12.         };
  13. }
复制代码
或者
  1. struct strA {
  2.         int a;
  3.         union {
  4.                 char c;
  5.                 int b;
  6.         }
  7. };

  8. void foo(int n) {
  9.         struct strA s = {
  10.                 .a = n,
  11.         };
  12.         s.c = 'a';
  13. }
复制代码
问了别人,据说是原写法是符合c99标准的,但较老版本的gcc可能会出错,后两种写法则是
符合c89的。身边没有标准手册,未能证实,请论坛的标准达人解答下,谢谢了~!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-09-07 10:56 |只看该作者
我不清楚标准,但知道有些编译器不支持匿名union的

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
3 [报告]
发表于 2012-09-07 11:37 |只看该作者
这个倒是从来没考虑过标准,我的做法是 只要编译过就可以了

论坛徽章:
0
4 [报告]
发表于 2012-09-07 11:43 |只看该作者
应该是这个问题
回复 2# hellioncu


   

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2012-09-07 12:00 |只看该作者
gcc 4.7 报的是:
sorry, unimplemented: non-trivial designated initializers not supported

论坛徽章:
0
6 [报告]
发表于 2012-09-07 12:10 |只看该作者
本帖最后由 sacry 于 2012-09-07 12:31 编辑

http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

说不定C11可以?


-----
臆测下,三种写法分别符合...
1,C11
2,C99
3,gcc extension

论坛徽章:
0
7 [报告]
发表于 2012-09-07 12:51 |只看该作者
我只知道少了个分号。。
匿名结构体是c11和GUNC的feature,gcc 4.7和clang3.1表示无压力

论坛徽章:
0
8 [报告]
发表于 2012-09-07 15:34 |只看该作者
justmao945 发表于 2012-09-07 12:51
我只知道少了个分号。。
匿名结构体是c11和GUNC的feature,gcc 4.7和clang3.1表示无压力


这个代码是临时敲的,可能有点小问题。
我觉得也应该是匿名联合的使用问题,内核代码中也有在结构体中定义匿名联合的用法,
但是没有看到这种用法的时候在定义结构体的同时初始化是怎么做的。

我想知道这种情况下,在内核代码中到底应该怎么写比较合适呢?

论坛徽章:
0
9 [报告]
发表于 2012-09-07 15:37 |只看该作者
sacry 发表于 2012-09-07 12:10
http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

说不定C11可以?


Linux似乎是遵循c89的吧?那c89应该怎么写呢?

论坛徽章:
0
10 [报告]
发表于 2012-09-07 15:43 |只看该作者
bruceteen 发表于 2012-09-07 12:00
gcc 4.7 报的是:
sorry, unimplemented: non-trivial designated initializers not supported


4.7应该不会报错的吧。
您是不是用了.cpp的后缀来测试了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP