C++ 常量变量未识别为数组维度

C++ 常量变量未识别为数组维度,c++,arrays,visual-c++,dimension,C++,Arrays,Visual C++,Dimension,(我在其他语言中使用VS,因此您可以发现一些差异) 我声明patternLength是一个常数,如您所见。ccode中对解决方案进行了注释,但我不想使用动态内存分配。一些想法?数组声明T[N]中的大小N必须是编译时常量表达式 int partialMatch[ patternLength ] ; // expression must have a constant value 数组大小必须在编译时已知 const变量不能确保。const限定符确保变量初始化后无法修改 编译时可以知道const

(我在其他语言中使用VS,因此您可以发现一些差异)


我声明patternLength是一个常数,如您所见。ccode中对解决方案进行了注释,但我不想使用动态内存分配。一些想法?

数组声明
T[N]
中的大小
N
必须是编译时常量表达式

int partialMatch[ patternLength ] ; // expression must have a constant value 

数组大小必须在编译时已知

const
变量不能确保。
const
限定符确保变量初始化后无法修改

编译时可以知道
const
变量的值。如果编译器可以检测到这一点,那么可以使用该变量定义数组的大小

更常见的情况是,
const
变量的值在编译时是未知的。它在运行时用一个值初始化,在初始化变量后不能更改该值。这不适合用于定义数组的大小


如果希望能够在编译时使用该变量,请改用
constepr
。编译器将尽最大努力在编译时计算值。如果无法在编译时计算变量的值,它将失败。

标记某个
常量本身并不会使其成为一个变量。它使它成为只读的。语句的右侧应该满足
strlen(纯字符串)
表达式不满足的要求。您可以创建自己的函数,该函数在编译时进行评估:

std::size_t const a{42}; // is one,

std::size_t foo{std::rand() % 100};
std::size_t const b{foo}; // is not, because it depends on foo
用它来代替:

constexpr size_t constexprlength(const char* s) {
    return strlen(s);
}

VLA和角色数组是邪恶的。改用
std::vector
std::string

数组大小必须是一个常量表达式。简而言之,常量表达式是一个在编译时可评估的表达式。删除了“重复”:它们没有解决为什么在C++中,<代码> const < /> >变量可能不够的问题。(OP知道非常量变量不能是数组维度,这正是这些链接所涵盖的)。实际上,所有这些都可以用来定义数组维度,因为编译器可以在编译时将它们作为constexpr进行计算。@DerekT.Jones不再是了。是的,这是一个更好的示例!谢谢。轻微的拼写修正:
constexpr
@DerekT.Jones,锐利的眼睛。已经修好了。
constexpr size_t constexprlength(const char* s) {
    return strlen(s);
}
constexpr size_t patternLength = constexprlength(plainString);
int partialMatch[patternLength];