【问题标题】:Same code compiling in g++, but not in VS [duplicate]在 g++ 中编译相同的代码,但在 VS 中没有 [重复]
【发布时间】:2017-02-02 19:32:52
【问题描述】:

我正在尝试在 Visual Studio 2015 中运行我的代码,但在下一个代码被剪断时,我在 double x1[dim];上收到下一个错误expression must have a constant value

double fitness(const double x[], const int &dim) {
     double sum = 0.0;
     double x1[dim];
     ...
     return sum;
}

g++ 4.8 上运行相同的代码没有错误。那么如何在 Visual Studio 2015 下做同样的事情呢。

我的编译器或代码实现有问题吗?

【问题讨论】:

  • 使用 std::vector 或 std::valarray
  • 我试图避免使用像 std::vector 或 std::array 这样的容器。
  • 然后你可以使用动态数组(newdelete),尽管我更喜欢 std::vector ,除非有非常编译的原因。顺便说一句,您的代码不起作用的原因是,可变长度数组,又名 VLA,是一个 c99 功能,默认情况下被 GCC 作为扩展支持(afaik GCC 的默认 C++ 方言选项是 -std=gnu++98 gcc 扩展已启用)。 MSVC 传统上对 C99 的支持很差,因此 MSVC 中可能不提供此语言功能。
  • g++ -Wall -std=c++14 -pedantic test.cpp 不会编译上述代码,因为VLAs 不是 C++ 标准的一部分; C99 允许,但您应该为此使用 gcc

标签: c++


【解决方案1】:

double x1[dim]; 是一个 VLA(可变长度数组)。它不是标准的 C++。

它在gcc 上工作的原因是gcc 有一个允许VLA 的扩展。 VS2015 没有,所以这就是它不编译的原因(虽然它有自己的设置扩展,但不是那个)。

最好的选择是std::vector

std::vector<double> x1(dim); //array of size dim

如果你不能使用它,你仍然可以使用手动动态数组(虽然不推荐这样做):

double* x1 = new double[dim];
delete[] x1; //Don't forget to delete it when you are done
//Alternatively, create a class which wraps the dynamic array, so you can use RAII

【讨论】:

  • @user3528438 差点错过了。谢谢!
  • 如果您使用的是新的,您应该将它分配给一个 unique_prr。或者使用 alloca
  • @doron 我不认为std::unique_ptr 支持数组。
  • @Rakete1111 std::unique_ptr supports arrays since it was standardized。它有一个专门针对数组的重载。
  • @nwp 哦,哇,我一定在某个时候错过了。谢谢。
【解决方案2】:

过去,当我想在 MSVC 上使用 VLA 时,解决方法是在不支持 VLA 的编译器上想要或需要 VLA 功能时使用alloca()

【讨论】:

  • 重量轻,简单且静态大小。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多