0

請採取以下代碼。MS Visual Studio錯誤:預期的常量表達式

#include "iostream" 
using namespace std; 
unsigned power(unsigned b, unsigned e){return e?b*power(b, e-1):1;}//Raises base b to a power e 
int main(int argc, char* argv[]) 
{const unsigned lev=5, len=power(2, lev)-1; 
int arr[len]; //Error according to Microsoft visual studio 
cout<<"The code worked."<<endl; 
} 

我的Codeblock編譯器與數組分配很好,但Microsoft Visual Studio表示該行需要一個常量表達式。

我明白從堆棧和動態分配的區別。但在這種情況下,參數len無論如何都是在編譯時靜態確定的。我將該值存儲在一個變量中(而不是直接使用5),這是因爲每次運行程序時我的測試用例都使用不同的len

那麼有沒有什麼辦法讓視覺工作室與它一起工作?或者我應該訴諸動態分配,即使CodeBlock接受它?

+1

無法重現(VS2013)。你在使用哪個Visual Studio? –

+0

[無法複製](http://rextester.com/GWXU44735)。請創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示。 –

+0

我正在使用VS 2010. – Della

回答

2
int arr[len]; 

len不是編譯時間常量表達式(它需要與power函數來計算,畢竟)。

C(而不是C++)允許直到運行時才知道長度的數組。這些被稱爲「可變長度陣列」(VLA)。

因此,您的代碼不是有效的C++。它與GCC協同工作,因爲該編譯器(默認情況下)將C++擴展爲一些額外的「功能」,而VLA就是其中之一。


But In this instance, the parameter len is determined statically anyway, at the compile time.

不,它被初始化到power函數的返回值。 C++(默認情況下)不允許「超級編譯」(執行任意數量的被認爲具有恆定結果的代碼),因此該函數只能在運行時調用。

從C++ 11開始,有constexpr關鍵字,它允許您標記某些(受限制的)函數,以便在編譯時間內執行它們的參數爲編譯時間常量的函數。

+1

是的,但功能'電源'可以''constexpr' – mpiatek

+0

@mpiatek確實,增加了一個關於constexpr的簡短說明 –