编译器错误:函数调用必须在常量表达式中具有常量值

Posted

技术标签:

【中文标题】编译器错误:函数调用必须在常量表达式中具有常量值【英文标题】:Compiler Error: function call must have a constant value in a constant expression 【发布时间】:2018-07-10 00:46:15 【问题描述】:

VS 给了我一个错误:

 int seam[Image_height(img)];

我真的不明白为什么?每次运行循环时我都需要一个新数组,它的大小由我传入的图像的高度定义。我也包含了它正在调用的函数。

int Image_height(const Image* img) 
    return img->height;


void horizontal_carve(Image *img, int newWidth) 

    ...

    int offset = Image_width(img) - newWidth;
    for (int i = 0; i < offset; ++i) 
        int seam[Image_height(img)];

        //do stuff with seam...

    

有人可以解释为什么我会收到错误

function call must have a constant value in a constant expression 

(特别是突出显示“Image_height(img)”)以及我能做些什么来解决它? 谢谢!

【问题讨论】:

使用std::vector 不幸的是,我需要为这个项目使用一个数组,不过谢谢 数组大小必须在编译时知道 Why aren't variable-length arrays part of the C++ standard?的可能重复 “很遗憾,我需要为这个项目使用一个数组” 你真的完全确定吗?使用std::vector 是正确的答案,它是一个可变长度数组,它是C++ 的一部分,你可以使用#include &lt;vector&gt;,它不是一个外部库或扩展。如果您想学习 C++,请不要避免。 【参考方案1】:

C++不支持变长数组,可以使用唯一的ptr

//int seam[Image_height(img)];
std::unique_ptr<int[]> seam(new int[Image_height(img)]); // c++11
auto seam = std::make_unique<int[]>(Image_height(img));  // c++14

【讨论】:

以上是关于编译器错误:函数调用必须在常量表达式中具有常量值的主要内容,如果未能解决你的问题,请参考以下文章

由于属性必须是常量表达式错误,Java 代码无法编译

intel fortran 编译错误“此内在函数在常量表达式中无效”

常量表达式

Visual C++ 表达式必须有一个常量值

预编译&作用域链

使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”