我不能合理化,为什么我们不能使用数组的大小作为函数调用返回常量。 编译时遇到以下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