Ответ 1
В С++ массивы переменной длины не являются законными. g++ допускает это как "расширение" (потому что C разрешает его), поэтому в g++ (не будучи -pedantic
о следующем стандарте С++) вы можете сделать:
int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++
Если вам нужен "массив переменной длины" (лучше называемый "массив с динамическим размером" на С++, поскольку правильные массивы переменной длины не разрешены), вам либо приходится динамически выделять память самостоятельно:
int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!
Или, еще лучше, используйте стандартный контейнер:
int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>
Если вы все еще хотите создать правильный массив, вы можете использовать константу, а не переменную при ее создании:
const int n = 10;
double a[n]; // now valid, since n isn't a variable (it a compile time constant)
Аналогично, если вы хотите получить размер от функции в С++ 11, вы можете использовать constexpr
:
constexpr int n()
{
return 10;
}
double a[n()]; // n() is a compile time constant expression