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

Posted

技术标签:

【中文标题】Visual C++ 表达式必须有一个常量值【英文标题】:Visual C++ Expression must have a constant value 【发布时间】:2016-02-01 23:17:57 【问题描述】:

有谁知道为什么 Visual Studio 是唯一给我这个错误的编译器 - 表达式必须有一个常量值(指大小)。

#include <iostream>
#include <cstring>
using std::cout; using std::endl;

int main() 
    const char Ca3[] =  "Hello" ;
    const char Ca4[] =  "World" ;

    const size_t size = strlen(Ca3) + strlen(Ca4) + 2;

    char bigString[size];
    strcpy(bigString, Ca3);
    strcat(bigString, " ");
    strcat(bigString, Ca4);
    cout << bigString << endl;

    system("PAUSE");
    return 0;

【问题讨论】:

strlen 是一个运行时函数。它不能在编译时使用。 【参考方案1】:

strlen 函数没有声明为constexpr,这意味着它的结果不是一个常量表达式

所以size 不是常量表达式,因此它不能用作数组维度。标准 C++ 中的代码格式不正确。

许多编译器都有一个扩展,即非常量表达式可以用作数组维度。如果另一个编译器接受此代码,那么这可能就是解释。您也许可以通过使用标准兼容开关(例如,对于 gcc,-std=c++14 -pedantic)来刺激其他编译器。


要解决这个问题,您可以编写自己的constexpr,相当于strlen;或者你可以使用sizeof。或者,您可以使用 std::string 并完全避免 C 样式的字符串处理。

【讨论】:

在正常情况下我会,但这是我在读的一本关于 C++ 的书中的练习。我不需要计算长度,但我只是想我会试一试。 你会如何使用sizeof【参考方案2】:

这种情况只发生在 VC++ 中的原因是 VC++(显然)是您尝试过的唯一在这方面符合 C++ 标准的编译器。

一段时间以来,C 有一个称为“可变长度数组”的特性,可以实现这一点。一些 C++ 编译器(尤其是 gcc)在 C++ 中也允许它们(至少默认情况下),即使 C++ 标准禁止它们。

如果您想要像数组一样的东西,但也允许您在运行时指定其大小,您通常需要 std::vector 而不是数组。

【讨论】:

以上是关于Visual C++ 表达式必须有一个常量值的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中,表达式必须具有带有 Windows 窗体的类类型 C++

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

使用 ofstream 时“表达式必须具有常量值”

C++constexpr和常量表达式

Java范例集锦

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