免费注册 查看新帖 |

Chinaunix

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

[C] struct有几种初始化方法以及编译器区分c和c++源文件的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-08 03:54 |只看该作者 |倒序浏览
本帖最后由 x5miao 于 2011-09-08 09:50 编辑

我知道C对struct结构体有两种初始化方法。比如对于以下结构体
  1. typedef struct
  2. {
  3.         char a;
  4.         int b;
  5. }A;
复制代码
方法一:A a={'c',4};
方法二:A a={.a='c',.b=4};
    其中方法一是所有的C标准都支持的结构体变量初始化方法,方法二是C99新增的初始化方法。
但今天突然看到了一种使用冒号的新的初始化方法
方法三:
  1. A a={a:'c',b:4};
复制代码
我用gcc -Wall -o a.out a.c -std=c99
gcc -Wall -o a.out a.c -std=c89
以及g++ -Wall -o a.out a.c编译都能通过,难道是C标准在一开始就支持这种初始化方法吗?为什么这种初始化方法在我看的C语言的书里面都从来没人提过啊?
    更让我感到惊讶的是当我把a.c的文件名改成a.cpp时用g++编译器对用方法一和方法三来进行初始化的源文件时也是可以的,这是不是意味着c++也支持方法三的structure初始化方式?(当然c++不支持方法二的初始化方式。)

还有一个问题gcc和g++分别是如何区别源代码文件是C还是C++源文件的啊?是只和文件名后缀有关吗?

论坛徽章:
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
2 [报告]
发表于 2011-09-08 08:15 |只看该作者
你把g++当成了C++标准了?

论坛徽章:
0
3 [报告]
发表于 2011-09-08 09:49 |只看该作者
本帖最后由 x5miao 于 2011-09-08 10:05 编辑

回复 2# bruceteen

正因为我知道g++编译成功和c++标准不是一回事,所以即使编译通过了但我对这种初始化方法是否符合标准依然有疑问。

还有提醒一下,我问的大致包括四个问题:
(1)第三种初始化方法是否符合c标准?是那个标准规定的?
(2)第三种初始化方法是否符合c++标准?是哪个标准规定的?
(3)gcc区别源文件是c还是c++源文件的方法?
(4)g++区别区别原文件类型的方法?

论坛徽章:
0
4 [报告]
发表于 2011-09-08 11:26 |只看该作者
这么多人浏览怎么没人来说说了?记得群里有几个对标准很熟悉的人啊,今天都没上线吗?

pmerofc在不在?

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
5 [报告]
发表于 2011-09-08 11:30 |只看该作者
1. struct的初始化方法,建议还是一个一个来吧。要是想装b,直接拷贝一块内存最吓人



2. #ifdef __cplusplus

论坛徽章:
0
6 [报告]
发表于 2011-09-08 11:49 |只看该作者
本帖最后由 x5miao 于 2011-09-08 11:52 编辑

回复 5# txdgtwpv


    第一种初始化方法C和C++都支持,第二种初始化方法c99支持,C89和c++不支持(不知道新出的c++0x支不支持)?
所以我要知道的是第三种初始化方法是否符合标准以及符合那一种标准的问题。

不知道你写#ifdef __cplusplus在这里是什么意思?我想问的是编译器如何判断所编译的源文件是c还是c++源文件

论坛徽章:
0
7 [报告]
发表于 2011-09-08 12:02 |只看该作者
好吧,通过加-pedantic-errors知道了第三种方法不符合任何一种C或C++标准,也不是gnu的标准扩展。

      这到底是个什么语法啊?好像不符合任何标准但在不加-pedantic的时候竟然能编译通过。

论坛徽章:
0
8 [报告]
发表于 2011-09-08 12:08 |只看该作者
代码复杂是给人类看的吗

论坛徽章:
0
9 [报告]
发表于 2011-09-08 12:31 |只看该作者
回复 8# 毛xx总理


    这和代码复不复杂没有关系吧,只是很好奇而已。在CSDN看到一些人说这是C99新增的语法,可是我查了半天也没看到C99有规定这个

论坛徽章:
0
10 [报告]
发表于 2011-09-08 16:10 |只看该作者
好吧,通过加-pedantic-errors知道了第三种方法不符合任何一种C或C++标准,也不是gnu的标准扩展。

      ...
x5miao 发表于 2011-09-08 12:02



你怎么确定的“也不是gnu的标准扩展”?

http://www.gnu.org/s/gnu-c-manua ... g-Structure-Members

You can also omit the period and use a colon instead of ‘=’, though this is a GNU C extension:

     struct point first_point = { y: 10, x: 5 };
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP