2016-03-18 43 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...) ... - 最丑的,但总是工作

相关问题