我有一段代码:
int CPUs = GetNumCPUs();
FILE *newFile[CPUs];
我有一个错误。它在第二行标记了“CPU”并说:“表达式必须具有恒定值”。
我曾尝试使用const
,但它不工作。
You can't have a varible sized array in C++. Adding const
to CPUs
doesn't help, it only makes the variable read-only, but it's still not a compile time constant because it's initialized by a function at run-time.
The usual solution is to use a vector:
std::vector<FILE*> newFile(CPUs);
GetNumCPUs()
每次运行程序时,它的值可能会或可能不会改变 - 所以它不是恒定的。如果您想要一个具有可变数量元素的数组,请尝试std::vector
:
std::vector<FILE*> newFile(GetNumCPUs());
在您的代码中,const
并不意味着“恒定”。在这种情况下,这意味着该对象是只读的——即您不能修改该对象。您正在尝试创建一个可变长度数组,这在 C++ 中是不允许的。使用std::vector
,使用new
来分配内存,或者编写一个 C99 程序,其中允许像您尝试制作的 VLA。
在这种情况下,使用 aconst
并不能解决您的所有问题。问题是数组必须在编译时初始化,所以如果你有一个函数返回一个变量(GetNumCPUs()
)并将它分配给一个常量(const int CPUs
),这个变量在编译时是未知的,但在运行时是未知的,编译器不能为数组分配数据空间。
std::vector
但是,使用允许可变存储空间。
std::vector<FILE*> newFile(CPUs);
这应该可以正常工作。这里有几个教程:
http://www.dreamincode.net/forums/topic/33631-c-vector-tutorial/
You should dynamically create the array with new[]
int CPUs = GetNumCPUs();
FILE** newFile = new (FILE*)[CPUs];
After you're done with it, you're now responsible for deleting it as well:
delete[] newFile;
CPU 在编译时是未知的。