数组初始化的一个问题
时间:2010-07-12
来源:互联网
我分别用VC9(cl test.c /Za)和GCC(gcc test.c -ansi)编译,前者失败,后者成功了
翻看TCPL,似乎不允许这样初始化数组
- #include <stdio.h>
-
- void func(char *str1, char *str2, char *str3)
- {
- char *strArr[] = {str1, str2, str3}; // 这里!!!!!!
- int i = 0;
-
- for (i = 0; i < (sizeof(strArr) / sizeof(strArr[0])); ++i)
- {
- printf("%s\n", strArr[i]);
- }
- }
-
- int main()
- {
- char str1[] = "abcd";
- char str2[] = "efg";
- char str3[] = "hij";
-
- func(str1, str2, str3);
-
- return 0;
- }
作者: tyc611 发布时间: 2010-07-12
作者: hellioncu 发布时间: 2010-07-12
作者: peijue 发布时间: 2010-07-12
.......
作者: egmkang 发布时间: 2010-07-12
MS明确不支持C99,不要搞了
egmkang 发表于 2010-07-12 14:39
这跟变长数组无关吧,有3个元素的指针数组
作者: hellioncu 发布时间: 2010-07-12
作者: peijue 发布时间: 2010-07-12
MS明确不支持C99,不要搞了
egmkang 发表于 2010-07-12 14:39
看GCC文档:
In C mode, this is equivalent to `-std=c90'. In C++ mode, it is equivalent to `-std=c++98'.
作者: tyc611 发布时间: 2010-07-12
test.c: In function `func':
test.c:5: warning: initializer element is not computable at load time
test.c:5: warning: initializer element is not computable at load time
test.c:5: warning: initializer element is not computable at load time
作者: tyc611 发布时间: 2010-07-12
不知道你的VC9这个编译器是怎么设置的,不过我的VC6.0可以编译过并正确运行。
这样使用我个人觉得没有问题。
作者: jlccwss 发布时间: 2010-07-12
hellioncu 发表于 2010-07-12 14:47
恩,看错了,好像是没关系
PS:
我的VC 9下面能跑...
作者: egmkang 发布时间: 2010-07-12
作者: peijue 发布时间: 2010-07-12
作者: 没本 发布时间: 2010-07-12
PS:
我的VC 9下面能跑...
egmkang 发表于 2010-07-12 14:59
文件后缀.c,加上/Za选项禁用编译器扩展,然后再试试
作者: tyc611 发布时间: 2010-07-12
没本 发表于 2010-07-12 15:04
我只是看见别人的代码里这样用了,感觉很奇怪,自己以前从没这样用过
作者: tyc611 发布时间: 2010-07-12
很奇怪么,C/C++的main()你忘记啦?
作者: 没本 发布时间: 2010-07-12
tyc611 发表于 2010-07-12 15:09
恩,大概知道了
谢谢哈
作者: egmkang 发布时间: 2010-07-12
很奇怪么,C/C++的main()你忘记啦?
没本 发表于 2010-07-12 15:14
这里讨论的问题是,{}中的数组初始化表达式没有使用常量表达式,好像C语言里要求常量表达式(不确定)
作者: tyc611 发布时间: 2010-07-12
拿微软的C编译器验证C标准,你真幽默。ANSI C没有限制自动变量的初始化不能为任何表达式,仅静态/外部变量受限。
作者: 没本 发布时间: 2010-07-12
也不知道有没有写过这种代码……
悲剧之一:
6.5.7 Initialization
All the expression in an initializer for an object that has static storage duration or in an
initializer list for an object that has aggregate or union type shall be constant expressions.
c89在此处和C++有区别
悲剧之二:
aggregate type也就是array和struct。
也就是说, 除了array, struct, union, 还有其他类型可以使用initializer。
也就是说, 可以这样……
- int i = { 1212 };
- int f(void)
- {
- int i = { 1212 }; /* ok */
- int j = { f() } /* ok */
- int a[] = { 326 }; /* ok */
- int b[] = { f() }; /* error */
- return 0;
- }
- int I = { 1212 }; /* ok */
- int J = { f() }; /* error */
- int A[] = { 326 }; /* ok */
- int B[] = { f() }; /* error */
4
All the expressions in an initializer for an object that has static storage duration shall be
constant expressions or string literals.
上面的b在C99中是ok的。
作者: OwnWaterloo 发布时间: 2010-07-12
拿微软的C编译器验证C标准,你真幽默。ANSI C没有限制自动变量的初始化不能为任何表 ...
没本 发表于 2010-07-12 16:49
哎,难道你还生活在十年前?
作者: tyc611 发布时间: 2010-07-12
作者: peijue 发布时间: 2010-07-12
tyc611 发表于 2010-07-12 20:05
你在哪里看到用/Za开关就能生成符合ANSI C标准的代码?
作者: 没本 发布时间: 2010-07-12
另外,我现在用的是VC++10.0,那个VC++9.0已经被我淘汰掉了,这是不是该说你生活在三年前?
作者: 没本 发布时间: 2010-07-12
没本 发表于 2010-07-12 21:04
我有说/Za开关能生成符合ANSI C标准的代码?前面我只回答了网友/Za禁用编译器扩展,这两者一个意思?
对于编译器实现,一是实现标准,二是做一些有用的扩展。为了验证标准的语言特性,我当然首先需要关闭编译器扩展功能。必要条件与充分条件。。。
话说回来,虽然十年前的VC6对标准支持不好,但已经是过去的事了,VC8开始已经对标准支持相当好了。虽然还是不支持c99,但其对C++现有标准、TR1、C++0x的支持都是很好的。
作者: tyc611 发布时间: 2010-07-12
另外,我现在用的是VC++10.0,那个VC++9.0已经被我淘汰掉了,这是不是该说你生活在 ...
没本 发表于 2010-07-12 21:06
呵呵,真不好意思,我一直与时俱进,同样在用VC10
作者: tyc611 发布时间: 2010-07-12
作者: ckf513728912 发布时间: 2010-07-12
OwnWaterloo对C标准下的解释我学习了,认为就是如此结论,不再跟贴。
楼主14楼的的发言可能我理解角度有误,回复得不妥请见谅。
作者: 没本 发布时间: 2010-07-12
------ 别人说的“拿微软的C编译器验证C标准,你真幽默”,没说“拿微软的C++编译器验证C++标准,你真幽默”,所以那人没说错呀!因为在C语言上,VC10并不比VC6有任何改进,还是只支持老旧的C89
作者: bruceteen 发布时间: 2010-07-13
作者: raindy1234 发布时间: 2010-07-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28