Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;支持可变长度数组?_C++_C++11_Variable Length Array - Fatal编程技术网

C++ C++;支持可变长度数组?

C++ C++;支持可变长度数组?,c++,c++11,variable-length-array,C++,C++11,Variable Length Array,不,等等,请容忍我 VLA始终是GCC的扩展,但它们被C99采用: [C99:6.7.5.2/4]:如果大小不存在,则数组类型为 不完整类型。如果大小为*而不是表达式,则 数组类型是未指定大小的可变长度数组类型,它 只能在具有函数原型范围的声明中使用;这样的 尽管如此,数组仍然是完整的类型如果大小为整数 常量表达式,并且元素类型具有已知的常量大小。 数组类型不是可变长度数组类型否则 数组类型是可变长度数组类型。 C99也称为ISO/IEC 9899:1999 现在: [C++11:1.1/2]:

不,等等,请容忍我

VLA始终是GCC的扩展,但它们被C99采用:

[C99:6.7.5.2/4]:
如果大小不存在,则数组类型为 不完整类型。如果大小为*而不是表达式,则 数组类型是未指定大小的可变长度数组类型,它 只能在具有函数原型范围的声明中使用;这样的 尽管如此,数组仍然是完整的类型如果大小为整数 常量表达式,并且元素类型具有已知的常量大小。 数组类型不是可变长度数组类型否则 数组类型是可变长度数组类型。

C99也称为
ISO/IEC 9899:1999

现在:

[C++11:1.1/2]:
C++是一种基于 关于ISO/IEC 9899:1999中规定的C程序设计语言 (以下简称C标准)。除了 由C、C++提供的设备提供< /强>附加数据类型、类, 模板、异常、命名空间、运算符重载、函数名 重载、引用、免费商店管理操作员和 增加图书馆设施


那么,C++11不也应该有VLAs吗?

这个C99特性实际上被C++自己的语义覆盖,就像任何其他“继承”特性一样:

[C++11:8.3.4/1]
:在声明
td
中,其中
D
具有以下形式

D1
[constant expressionopt]属性说明符seqopt

[……]

<这是我们在C++中给出的唯一的数组声明语法。< /P>
请注意,“与C的兼容性”条款中未提及此差异。C.1

两种语言的常量表达式定义不同

const size_t size = 5;
int array[size]; // array in C++, VLA in C

这种灵活的措辞并不意味着C99中的任何内容都在C++11中。你引用的只是介绍性的文字。

这是为我编译的:(g++4.6 with
-std=c++0x
)。但它并不是用
-pedantic
编译的(谢谢@MarkB)。相反,它警告说:“模板.CPP:7:12:警告:ISO C++禁止可变长度数组'n'[-Wvla ] < /p> 因此,编译器在编译时无法知道
n
的大小。这是一个GNU扩展到C++吗?这似乎是一个GNU扩展,VLA不是C++11的官方部分


(当然,我只是在玩一个编译器。所以对此要小心谨慎。)

相关:(虽然我的问题实际上是关于技术上说该特性最初不是从C99继承来的;另一个是询问委员会是否可以明确地这样做)无论如何,“基于C编程语言”我认为这是一篇信息性很强的文章。“除了C提供的设备”意味着“除了C提供的一些设备,我们还加入了C++”,“哦,如果有什么东西,我们忘记在下面的文本中提到,那么也在C++中”;史蒂夫:好的。也许我当时遇到的问题是,假设C语言以及C标准库在默认情况下“继承”自C99。也许只是图书馆,语言只是作为设计的基础被引用。好的,每一个从C中获取的库函数都被列在C++标准中,引用了C99标准,“这个函数和那边一样”,并且在少数情况下“……有以下不同”。所以我同意,并没有大规模的继承,只是挑选99%的樱桃。C99 VLA与GCC的数组有不同的行为。C99没有采用GCC数组。我认为它甚至不是一个“覆盖”——C特征不是C++的继承,而是通过构图和曝光来实现的。C++中没有明确提到的任何C特征都不存在,恰好C++继承了“C”中的“无”,只是巧合地包含类似的文本。但是作者显然是有动机在可能的情况下提供C特性,并且他们不认为这些特性很愚蠢;int n[x]计数?这在g++4.6上对我有用。当然,X不是一个常态表达式吗?“Aaron McDaid,如果你没有用<代码> -PoangNoth<代码>编译(或者它是代码> -ANSI ?)你可能得到了G+扩展。@ MarkB,代码> -Poangnic 给我“模板。CPP:7:12:警告:ISO C++禁止可变长度数组‘n’[-Wvla ]”我以前有-Wall和-Wextra。从GCC的角度来看,这不是一个“所有警告”的问题,而是“你希望我编译什么语言”。如果你不说“代码> -PoaNoTi”,那么你就不在编译C++,而是用扩展来编译C++。如果你说
std=gnu++0x
,你得到的扩展和语言更改与标准相矛盾,而不是有效地扩展标准。我假设编译器编写人员不会将此设置为默认设置,因为他们认为首先扩展语言是一个好主意(结合傲慢和抱怨的客户)。(a)GCC也有VLA作为扩展。(b) 在过去,我见过在数组维度可变时检测失败的情况。这就是g++扩展。如果你用<代码> -PodiaTy[/CODE ]编译它,它警告它使用的是编译器扩展而不是ISO C++。重述这一点,我引用的是标准的,似乎严重暗示着C++提供了<代码>由C < /Cord> @ LeunnEasraceSin轨道提供的设施,具体是在哪个句子中你推断出的?“A基于B”的说法并不意味着B的每一个特征都出现在A中。例如,“基于真实故事”的电影并不包含它所基于的真实故事的每一个特征。如果你写了一个“基于另一个提案”的提案,这并不一定意味着其他提案的任何特点
int main(int argc, char ** argv) {
    int n[argc];
}