34

不,等等,忍耐一下……

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 不应该也有 VLA 吗?

4

4 回答 4

17

留有余地的措辞并不意味着 C99 中的所有内容都在 C++11 中。你引用的只是介绍性文字。

于 2011-12-21T17:55:44.960 回答
14

这个 C99 特性被 C++ 自己的语义有效地覆盖,任何其他“继承”的特性都可以:

[C++11: 8.3.4/1]:在声明T DD具有表格

D1[常量表达式选项]属性说明符序列选项

[..]

这是我们在 C++ 中给出的唯一数组声明语法。

请注意,“与 C 的兼容性”子句中没有提及这种差异C.1

于 2011-12-21T17:14:46.960 回答
7

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

const size_t size = 5;
int array[size]; // array in C++, VLA in C
于 2011-12-21T17:49:09.243 回答
4

这为我编译:(g++ 4.6 with -std=c++0x)。但它不能编译-pedantic(感谢@MarkB)。相反,它警告说“ template.cpp:7:12: warning: ISO C++ forbids variable length array 'n' [-Wvla]

int main(int argc, char ** argv) {
    int n[argc];
}

因此n编译器在编译时无法知道 的大小。这是对 C++ 的 GNU 扩展吗?这似乎是一个 GNU 扩展,并且 VLA 不是 C++11 的官方部分。

(当然,我只是在玩编译器。所以用一点盐来处理。)

于 2011-12-21T17:59:48.967 回答