我不能合理化,爲什麼我們不能使用數組的大小作爲函數調用返回常量。 編譯時遇到以下errror錯誤。 錯誤E2313:在主函數要求常量表達式()爲什麼C++數組的大小有一個函數調用返回常量
int getsize()
{
return 2;
}
void main()
{
const int x= getsize();
int arr[x];
}
我不能合理化,爲什麼我們不能使用數組的大小作爲函數調用返回常量。 編譯時遇到以下errror錯誤。 錯誤E2313:在主函數要求常量表達式()爲什麼C++數組的大小有一個函數調用返回常量
int getsize()
{
return 2;
}
void main()
{
const int x= getsize();
int arr[x];
}
你沒有與constexpr
屬性聲明getsize()
。如果您使用constexpr
,許多現代C++編譯器將能夠做到您想要的。
我希望你得到的點數組大小應該是constant
,但它也應該在編譯時是靜態的。你的常量int返回函數在編譯時不能產生靜態常量值。如果您按照Logicrat函數的建議使用constepxr
,則編譯時將返回一個靜態常量值,並且它將由現代C++編譯器進行編譯。
該標準要求在編譯時數組大小是可計算的值,以便編譯器可以確定它必須爲堆棧中的程序分配的內存。就你而言,即使你看起來已經聲明瞭一個常量值,但值const int x
只在運行時被分配,因此無法幫助確定堆棧的內存。
這就是原因,動態大小的數組總是在堆上分配內存。如前所述,一些較新的編譯器(也許是g ++)可以讓你能夠實現你所要求的內容,但如果你的目標是讓代碼跨編譯器移植,那麼這不是一個好主意。
如果改爲定義X,你不會得到錯誤E2313
#define arraySize 2
void main()
{
int arr[arraySize];
}
您有這幾個選項:
在最新çconstexpr
++編譯器
模板類基於函數的調用像getsize<>::value
- 幾乎可以在所有C++編譯器中工作
編譯時間常數:enum { size = ... }
- 將工作大概在所有的C++和許多C編譯器
#define SIZE ...
,或#define GETSIZE(args...) ...
- 最醜的,但總是工作
需要注意的是 「常量表達式」 有標準中的特定含義(對於你寫的代碼,'x'不符合)。它不僅僅意味着帶有const限定類型的任何表達式。 –
「常量表達式」是一個在編譯時爲常數*的術語,在您的示例中(理論上)不是這種情況。它會工作,如果你寫:'const int x = 5; int arr [x];'因爲編譯器確定表達式是不變的。 – Flovdis