2012-03-26 76 views
1

我正在讀一本書說,在C++中,你不能做到這一點的變量:定義數組的長度與C++/C

int array_size = 3; 
int array[array_size]; 

然後我用gcc試了一下,但沒」完全不抱怨(例外警告關於未使用的array)。

而且我也讀到了this question .The 4回答說,你可以使用這樣的事情:char someCondition[ condition ];對我來說,condition將只知道,直到運行時,所以整個事情似乎真的混雜到me.Can誰能幫助解釋一下嗎?

感謝,G

+0

您已經啓用了編譯器標誌來當作警告視爲錯誤,或者接通標誌關閉或使用'array'以某種方式擺脫這些警告/錯誤。 – 2012-03-26 04:59:17

回答

7

如果您使用的是C++編譯器的工作原理,因爲大部分的C++編譯器提供支持Variable Length arguments(VLA)一個編譯器擴展。

如果您使用的是C編譯器,它可以工作,因爲標準允許。


在C++中,VLA不是由C++標準允許的,因此通過編譯器擴展的任何使用將會使你的代碼不便於攜帶。
C++提供了std::vectorstd :: array(C++ 11),它們滿足使用變長數組或c樣式數組resp的所有需求,您應該使用它們。

需要注意的是,由於C99標準,VLA公司被允許在C.

+1

+1指出他正在使用C99的VLA,但我不認爲說std :: vector或std :: array是完美的替代品是公平的。 'std :: vector'涉及堆分配(潛在的成本很高),而'std :: array'需要編譯時已知的大小。我希望在將來的C++版本中看到VLA,因爲它們在低層編碼不可避免的情況下非常有用,並且VLA確實有助於避免在這種情況下耗盡堆棧,因爲固定堆棧陣列會使用太多堆棧並溢出堆棧或太少並超出陣列。 – stinky472 2012-03-26 04:48:09

+0

我知道我已經得到了我的答案,但是我想知道你是否允許VLA在c中,它會是堆棧還是堆棧?看起來很難實現這個,如果你確實需要VLA,你可以用其他方式來實現。 c99會標準化這個? – Gnijuohz 2012-03-26 04:54:27

+0

@ stinky472:標準委員會審查了一項[提案](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2648.html),以使VLA達到標準C++ 0x天,但沒有佔用。可能會再次檢查下一個標準版本,但這似乎太遙遠C++ 12 ...也許:) – 2012-03-26 04:55:22