我无法合理化,因为为什么我们不能使用数组的大小作为返回常量的函数调用。编译时遇到以下错误。错误 E2313:函数 main() 中需要常量表达式
int getsize()
{
return 2;
}
void main()
{
const int x= getsize();
int arr[x];
}
您没有使用 constexpr
属性声明getsize()
。如果您确实使用 constexpr
,许多现代 C++ 编译器将能够做您想做的事情。
您有几个选项:
-
constexpr
最新的C++编译器 -
像
getsize<>::value
一样调用的基于模板类的函数几乎适用于所有C++编译器 -
编译时常量:
enum { size = ... }
- 可能适用于所有C++和许多 C 编译器 -
#define SIZE ...
或#define GETSIZE(args...) ...
- 最丑陋,但始终有效
该标准要求数组大小在编译时为可计算值,以便编译器可以确定它必须为堆栈上的程序分配的内存。 在您的情况下,即使您看起来已经声明了一个常量值,值const int x
也仅在运行时分配,因此无助于确定堆栈的内存。
这就是动态大小的数组始终在堆上分配内存的原因。
如前所述,一些较新的编译器(可能是 g++)将允许您实现您要求的内容,尽管如果您的目标是拥有跨编译器可移植的代码,这将不是一个好主意。
如果改为定义 x,则不会收到错误 E2313
#define arraySize 2
void main()
{
int arr[arraySize];
}
我希望你得到的点数组大小应该是constant
但在编译时它也应该是静态的。常量 int 返回函数无法在编译时生成静态常量值。如果您按照 Logicrat 的建议使用 constepxr
函数将在编译时返回一个静态常量值,它将由现代C++编译器编译。