c++ - const 变量不被识别为数组维度
问题描述
long AnsiString::pos(const char* plainString) const {
const size_t patternLength = strlen(plainString);
if (patternLength == 0) return -1;
size_t stringLength = count;
int partialMatch[patternLength]; // int* partialMatch = new int[patternLength];
KMPBuildPartialMatchTable(plainString, partialMatch);
int currentStringCharacter = 0;
int currentPatternCharacter = 0;
while (currentStringCharacter < stringLength) {
if (currentPatternCharacter == -1) {
currentStringCharacter++;
currentPatternCharacter = 0;
}
else if (items[currentStringCharacter] == plainString[currentPatternCharacter]) {
currentStringCharacter++;
currentPatternCharacter++;
if (currentPatternCharacter == patternLength) return currentStringCharacter - currentPatternCharacter;
} else {
currentPatternCharacter = partialMatch[currentPatternCharacter];
}
}
// delete(partialMatch);
return -1;
}
我在使用 Visual C++ 实现这个 claas 方法时遇到错误。
int partialMatch[ patternLength ] ; // expression must have a constant value
(我正在使用其他语言的 VS,因此您可以找到一些差异)。
如您所见,我将 patternLength 声明为常量。在 ccode 中注释了一个解决方案,但我不想使用动态内存分配。一些想法?
解决方案
数组大小必须在编译时知道。
const
变量并不能确保这一点。const
限定符确保变量一旦被初始化就不能被修改。
变量的值const
可以在编译时知道。如果编译器可以检测到这一点,则该变量可用于定义数组的大小。
更常见的是,const
变量的值在编译时是未知的。它在运行时用一个值初始化,变量初始化后不能更改。这并不适合用于定义数组的大小。
如果您希望能够在编译时使用该变量,请constexpr
改用。编译器将尽最大努力在编译时评估该值。如果在编译时无法评估变量的值,它将失败。
推荐阅读
- python - 如何继承第三方模块的控制器来定制Odoo 12?
- python - 使用 f2py 从 fortran 返回 0 长度数组到 python
- c# - 角度不同时如何检测其他图像中的模板图像?
- angular - 根据是/否单选按钮选择添加和删除 Angular 表单的输入
- java - 程序不断说缺少退货声明
- python - FIX 市场数据请求问题 - 重复组的 NumInGroup 计数不正确
- c++ - std::move 不适用于 RValue 引用函数
- iis - 如何修复“错误:无法启动应用程序:启动会话时出错。”
- kubernetes - 如何在 kubeflow 中为用户 pvc 指定存储类
- python-3.x - Google colab:如何为 pytesseract 安装训练数据文件?