Vor kurzem fand ich ein interessantes Verhalten von g ++, wenn sie mit MSVC Vergleich ++ 2008 dieses kleine Programm vor:Unterschiedliches Verhalten von Compilern mit Array-Zuweisung
#include <cstdlib>
const int ARR_LENGTH = 512;
void doSomething(int iLen);
int main(int argc, char** argv)
{
doSomething(ARR_LENGTH);
return 0;
}
void doSomething(int iLen)
{
int iTest[iLen];
return;
}
Wird es kompilieren? Was denken Sie? Nach meiner Kenntnis von C (oder C++ für diese Angelegenheit), sollte dies nicht kompilieren, da ich die Funktion doSomething() mit jeder beliebigen Zahl aufrufen kann, so dass die Größe des iTest-Array nicht zur Kompilierzeit bestimmt werden kann. Allerdings, wenn ich versuche, dies mit g ++ zu kompilieren, funktioniert es gut. Jetzt kann ich verstehen, was wahrscheinlich hier passiert ist - der Compiler hat bemerkt, dass ich diese Funktion nur einmal aufrufen muss, indem ich eine Kompilierzeitkonstante als Parameter übergebe. Einige ernsthaften Optimierungen gehen hier ... Aber wenn ich versuche, dies mit MSVC++ 2008 zu kompilieren, bekomme ich diese:
1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size
Meine Frage ist:, wie dies mit der Definition der Sprache nicht entspricht (die C Standard (C++ Standard))? Ist es für g ++ in Ordnung, eine solche Optimierung zu machen (die in diesem Fall leicht zu sehen ist, aber das erste Mal, als ich darauf gestoßen bin, war es in einem großen Projekt und es machte auf den ersten Blick keinen Sinn).
mögliche Duplikate von [Arrays mit variabler Länge in C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –