2016-03-18 73 views
1

我不能合理化,爲什麼我們不能使用數組的大小作爲函數調用返回常量。 編譯時遇到以下errror錯誤。 錯誤E2313:在主函數要求常量表達式()爲什麼C++數組的大小有一個函數調用返回常量

int getsize() 
{ 
    return 2; 
} 

void main() 
{ 
    const int x= getsize(); 
    int arr[x]; 

} 
+0

需要注意的是 「常量表達式」 有標準中的特定含義(對於你寫的代碼,'x'不符合)。它不僅僅意味着帶有const限定類型的任何表達式。 –

+0

「常量表達式」是一個在編譯時爲常數*的術語,在您的示例中(理論上)不是這種情況。它會工作,如果你寫:'const int x = 5; int arr [x];'因爲編譯器確定表達式是不變的。 – Flovdis

回答

5

你沒有與constexpr屬性聲明getsize()。如果您使用constexpr,許多現代C++編譯器將能夠做到您想要的。

0

我希望你得到的點數組大小應該是constant,但它也應該在編譯時是靜態的。你的常量int返回函數在編譯時不能產生靜態常量值。如果您按照Logicrat函數的建議使用constepxr,則編譯時將返回一個靜態常量值,並且它將由現代C++編譯器進行編譯。

1

該標準要求在編譯時數組大小是可計算的值,以便編譯器可以確定它必須爲堆棧中的程序分配的內存。就你而言,即使你看起來已經聲明瞭一個常量值,但值const int x只在運行時被分配,因此無法幫助確定堆棧的內存。

這就是原因,動態大小的數組總是在堆上分配內存。如前所述,一些較新的編譯器(也許是g ++)可以讓你能夠實現你所要求的內容,但如果你的目標是讓代碼跨編譯器移植,那麼這不是一個好主意。

如果改爲定義X,你不會得到錯誤E2313

#define arraySize 2 

void main() 
{ 
    int arr[arraySize]; 
} 
2

您有這幾個選項:

  • 在最新çconstexpr ++編譯器

  • 模板類基於函數的調用像getsize<>::value - 幾乎可以在所有C++編譯器中工作

  • 編譯時間常數:enum { size = ... } - 將工作大概在所有的C++和許多C編譯器

  • #define SIZE ...,或#define GETSIZE(args...) ... - 最醜的,但總是工作

相關問題