首页 > 解决方案 > 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 中注释了一个解决方案,但我不想使用动态内存分配。一些想法?

标签: c++arraysvisual-c++dimension

解决方案


数组大小必须在编译时知道。

const变量并不能确保这一点。const限定符确保变量一旦被初始化就不能被修改。

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

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

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


推荐阅读