IDE/编译器数组处理的差异[重复]

Posted

技术标签:

【中文标题】IDE/编译器数组处理的差异[重复]【英文标题】:Differences with IDE/compilers array handling [duplicate] 【发布时间】:2012-09-18 20:35:27 【问题描述】:

可能重复:C/C++: Array size at run time w/o dynamic allocation is allowed?

我在一个类中,我们有一个简单的任务来编写一个函数,该函数返回一个指向动态数组的指针并提供一个存根来测试它。我已经完成了这项工作,所以我不会在作业上寻求帮助。在课堂博客上,另一位学生建议很直观地应该能够做到int Array[size]; 其中size 显然是用户定义的变量。 我知道在标准 C++ 中,至少根据我的文本,数组必须有一个“常量整数表达式......大于零”作为大小声明符。这对我来说意味着他们的例子不能工作。事实上,使用 VS2010 时,您会遇到三个错误。 但是,他们解释说:

我知道,你知道,甚至我的 Ubuntu 安装中的 g++ 编译器 我的 WinXP 安装上的 Bloodshed 编译器知道这一点。对于某些 “知道”的水平人们会期望“int Array [size];”去工作 (就像之前的两个课程一样)。

但显然它无法在某些人的 VS 编译器上运行。一罐 只假设,因为共同点是 VS(是的,我 通过让朋友在他的盒子上检查来确认这一点),VS 是 问题。几个之一。

因为I know that... 部分指的是我告诉他们不应该有任何理由使用#include <new> 来使用new,所以已经存在混淆,但似乎他们认为我们同意不应该有任何理由使用new 分配动态数组。(?) 所以问题很明显。是否有任何编译器可以接受int Array[size];,其中大小不是const int 而不会出错?

【问题讨论】:

查找变长数组。一些编译器将它们作为扩展提供。无论如何,没有需要使用new。最好只使用矢量。 【参考方案1】:
int Array[size];

其中size 不是常量表达式是可变长度数组。从 1999 年 ISO 标准开始,它们是 C 的标准功能。 C++ 标准没有采用它们,但一些编译器支持它们作为语言扩展。

(任何 C++ 编译器,当以一致性模式调用时,必须至少对具有非常量大小的数组类型发出诊断。)

顺便说一下,这与您使用的 IDE 没有直接关系;它由您的 IDE 调用的编译器控制。

至于#include <new>,有一个同名的标准标头,但对于语言中内置的new 运算符来说,它不是必需的。 <new> 标头提供了几个重载版本的 operator new 和一些其他声明。

【讨论】:

谢谢-我注意到new 标题并在今天查看了它。那么,您会说使用它是赞成/反对/无关紧要的吗?就是变长数组。 如果您在 C++ 中使用 VLA,您将代码的可移植性限制为支持它作为扩展的编译器。如果没有足够的内存来分配数组,程序的行为是不确定的;无法检测或处理分配失败。根据您的要求,您可能最好使用标准 C 库的功能,例如 <vector><array><list>

以上是关于IDE/编译器数组处理的差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章

数组是指针? [重复]

C ++的最佳编译器[重复]

cmd批处理,webStrom/phpStrom/.....IDE工具编译

代码指定的双精度和编译器选项双精度之间的差异

ARM Cortex-M 编译器差异

#ifdef vs #if defined 的差异