2010-05-19 54 views
26

我一直认为在C++中声明数组时,大小必须是一个常量整数值。用非常量变量声明数组大小

例如:

int MyArray[5]; // correct 

const int ARRAY_SIZE = 6; 
int MyArray[ARRAY_SIZE]; // correct 

int ArraySize = 5; 
int MyArray[ArraySize]; // incorrect 

这里还什么是The C++ Programming Language, by Bjarne Stroustrup解释说:

数组的元素个数(数组绑定)必须是常量表达式(§C.5)。 如果你需要变量边界,使用一个矢量(§3.7.1,§16.3)。例如:

void f(int i) { 
    int v1[i];   // error : array size not a constant expression 
    vector<int> v2(i); // ok 
} 

但我很大的惊喜,上面的代码不会编译我的系统上的罚款!

这里是我试图编译:

void f(int i) { 
    int v2[i]; 
} 

int main() 
{ 
    int i = 3; 
    int v1[i]; 
    f(5); 
} 

我没有错误! 我正在使用GCC v4.4.0。

有什么我失踪了吗?

+17

这就是为什么用编译器测试东西并不代表任何代码正确性的原因。 – GManNickG 2010-05-19 06:37:34

+1

重复的 http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed – nico 2010-05-19 06:40:22

回答

24

这是标准的GCC扩展:see here

当您使用其中一个扩展名(以便考虑到可移植性)时,可以使用-pedantic选项来使GCC发出警告或-std=c++98发生错误。

6

您正在使用C99中称为VLA(可变长度阵列)的功能。如果你这样编译你的程序会更好:

g++ -Wall -std=c++98 myprog.cpp