2012-03-26 8 views
1

ich ein Buch lese sagen, dass in C++ Sie dies nicht tun können:definieren die Länge eines Arrays mit einer Variablen in C++/C

int array_size = 3; 
int array[array_size]; 

Dann versuchte ich es mit gcc, aber es didn‘ t meckern überhaupt (Ausnahme warnte vor unbenutzten array).

Auch las ich über this question .Die vierte Antwort sagt, dass Sie so etwas wie diese verwenden: char someCondition[ condition ]; Für mich ist die condition nur erst zur Laufzeit bekannt sein würde, also das Ganze Verwechselung scheint wirklich jemand me.Can dies helfen, erklären?

Danke, G

+0

Sie haben die Compiler-Flags aktiviert als Warnungen als Fehler zu behandeln, können Sie entweder die Flaggen aus oder verwenden Sie das 'array' in irgendeiner Weise loswerden dieser Warnungen/Fehler. –

Antwort

7

Wenn Sie einen C++ Compiler funktioniert es, weil die meisten der C++ Compiler eine Compiler Erweiterung bereitzustellen, die Variable Length arguments(VLA) unterstützt.

Wenn Sie einen C-Compiler verwenden, funktioniert es, weil der Standard es erlaubt.


In C++, VLA nicht von dem C++ Standard erlaubt, so dass jede Nutzung es durch Compiler-Erweiterungen wird Ihren Code nicht portabel machen.
C++ bietet std::vector oder std :: array (C++ 11), die mit variabler Länge Array oder c-style-Arrays bzw. verwenden alle Anforderungen erfüllen und man sollte sie verwenden.

Beachten Sie, dass, da C99-Standard, VLAs erlaubt sind in C.

+1

+1 für den Hinweis, dass er die VLAs von C99 verwendet, aber ich glaube nicht, dass es fair ist zu sagen, dass 'std :: vector' oder' std :: array' sind perfekte Ersetzungen. 'std :: vector' beinhaltet eine Heap-Zuweisung (möglicherweise ziemlich hohe Kosten), während' std :: array' eine Größe benötigt, die zur Kompilierzeit bekannt ist. Ich würde gerne sehen, VLAs in zukünftigen Versionen von C++, wie sie nützlich sein können, wo Low-Level-Codierung unvermeidlich ist, und VLAs helfen vermeiden, den Stapel in solchen Fällen zu erschöpfen, weil ein festes Stack-Array entweder zu viel Stack verwenden würde und die stapeln oder zu wenig und überlaufen das Array. – stinky472

+0

Ich weiß, ich habe meine Antwort bereits, aber ich frage mich, ob Sie VLA in c erlauben, wo es wäre? Heap oder Stack? Scheint schwer, dies zu implementieren, und wenn Sie wirklich VLA benötigen, können Sie es auf andere Weise tun c99 würde dies standardisieren? – Gnijuohz

+0

@ stinky472: Ein [Vorschlag] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2648.html), um VLA's zum Standard zu bringen, wurde vom Standardkomitee während der Überprüfung überprüft C++ 0x Tage wurde aber nicht aufgenommen. Vielleicht wird es für die nächste Standardversion nochmal überprüft, aber das scheint zu weit weg zu sein C++ 12 ... vielleicht :) –

Verwandte Themen