一个恼人的c++数组问题

JKhere 2013-04-10 09:25:11
代码一:
const int x=5;
int num[x];
代码二:
int x=5;
int num[x];

代码一能够在gcc, vc6.0, vs2010上编译通过。
代码二能够在gcc上通过,而在vc6.0,vs2010上通不过。

我的问题是:
这是c++标准的问题,还是gcc自己的问题?
是因为vc6.0,vs2010的c++标准太老了,还是因为gcc自己搞了个标准?

很急,求解!
...全文
286 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yubao669016 2013-04-10
  • 打赏
  • 举报
回复
我用的也是VC6,好像是和你的版本不一样吧,我试了你的两种代码,都不行,除了malloc,new外,普通的数组在编译阶段就要确定大小,可以用#define N 4宏替换
Athenacle_ 2013-04-10
  • 打赏
  • 举报
回复
引用 10 楼 jkhere 的回复:
引用 9 楼 Athenacle_ 的回复:引用 8 楼 jkhere 的回复:引用 7 楼 Athenacle_ 的回复:引用 6 楼 jkhere 的回复:C99是GNU主导的标准 这话从何而来? GNU多C/C++的扩展多了去了 http://connect.microsoft.com/VisualStudio/feedback/details/60670……
感觉你在为MS辩护 就编译上来说,支持变长数组是很简单的东西、、 但毕竟vector和动态申请加上了额外的开销。
JKhere 2013-04-10
  • 打赏
  • 举报
回复
引用 9 楼 Athenacle_ 的回复:
引用 8 楼 jkhere 的回复:引用 7 楼 Athenacle_ 的回复:引用 6 楼 jkhere 的回复:C99是GNU主导的标准 这话从何而来? GNU多C/C++的扩展多了去了 http://connect.microsoft.com/VisualStudio/feedback/details/606707/vs2010-missing-c99-s……
其实现在想来,变长数组的作用也很有限,可以用vector,也可以动态申请,为了支持这个特性,不值得。
Athenacle_ 2013-04-10
  • 打赏
  • 举报
回复
引用 8 楼 jkhere 的回复:
引用 7 楼 Athenacle_ 的回复:引用 6 楼 jkhere 的回复:C99是GNU主导的标准 这话从何而来? GNU多C/C++的扩展多了去了 http://connect.microsoft.com/VisualStudio/feedback/details/606707/vs2010-missing-c99-support 微软忙着搞c++ 0……
只不过MS忙着建立自己的“标准”而已。MS想要支持C99的话,标准刚出的时候就可以开搞了,那时候还没有c++0x呢
JKhere 2013-04-10
  • 打赏
  • 举报
回复
引用 7 楼 Athenacle_ 的回复:
引用 6 楼 jkhere 的回复:C99是GNU主导的标准 这话从何而来? GNU多C/C++的扩展多了去了
http://connect.microsoft.com/VisualStudio/feedback/details/606707/vs2010-missing-c99-support 微软忙着搞c++ 0x了
Athenacle_ 2013-04-10
  • 打赏
  • 举报
回复
引用 6 楼 jkhere 的回复:
C99是GNU主导的标准
这话从何而来? GNU多C/C++的扩展多了去了
JKhere 2013-04-10
  • 打赏
  • 举报
回复
现在明白怎么回事了。g++是支持变长数组的(VLA),变长数组是c++ C99标准的新特性。C99是GNU主导的标准,M$完全无视,意图压制C99的普及度,所以vc6.0,vs2010,vs2012,包括vs2014(如果有的话),以后的vs都不会支持这个特性。 正因为如此,许多跨平台软件都不敢上C99特性,否则在Windows平台只能用gcc编译,这会导致体积和性能都受到影响 。 如果要考虑通用性的话,还是用动态数组吧! 谢谢大家!
jiangwei19900106 2013-04-10
  • 打赏
  • 举报
回复
引用 楼主 jkhere 的回复:
代码一: const int x=5; int num[x]; 代码二: int x=5; int num[x]; 代码一能够在gcc, vc6.0, vs2010上编译通过。 代码二能够在gcc上通过,而在vc6.0,vs2010上通不过。 我的问题是: 这是c++标准的问题,还是gcc自己的问题? 是因为vc6.0,vs2010的c++标准……
代码一能通过是因为x被定义为常量,用常量声明数组正确。代码二x是变量,用变量声明数组不被允许也很正常,就被算允许这样做还是不这样用为好。这么我觉得不必太多纠结。
lin5161678 2013-04-10
  • 打赏
  • 举报
回复
int x=5; int num[x]; C语言有VLA 如果编译器支持 可以这样做 C++不可以 C99之前的不可以
黑娃 2013-04-10
  • 打赏
  • 举报
回复
这个貌似是c99的标准,微软的编译器似乎都没有支持这个特性呢,gcc是支持的。
JKhere 2013-04-10
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
vs2010也不通过。变量x的值在编译阶段不确定,无法分配内存,只有new动态分配了 int *num = new int[x];
那为什么gcc可以,是gcc自己搞的新标准吗?
starytx 2013-04-10
  • 打赏
  • 举报
回复
vs2010也不通过。变量x的值在编译阶段不确定,无法分配内存,只有new动态分配了 int *num = new int[x];
赵4老师 2013-04-10
  • 打赏
  • 举报
回复
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
JonyDeng 2013-04-10
  • 打赏
  • 举报
回复
5L 正解 编译器要为你的数组分配内存,代码1中式常量,故可以分配内存。代码2中,是变量,编译器不知道你的数组占用内存多大,故不能通过编译

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧