【问题标题】:const variable not recognized as array dimensionconst 变量不被识别为数组维度
【发布时间】:2018-09-08 17:11:40
【问题描述】:
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 中注释了一个解决方案,但我不想使用动态内存分配。有什么想法吗?

【问题讨论】:

  • 数组大小必须是常量表达式。简而言之,constant-expression 是在编译时可评估的表达式。
  • 删除了“重复项”:他们没有解决为什么 const 变量在 C++ 中可能不够用的问题。 (OP 知道非常量变量不能是数组维度,这就是那些链接所涵盖的内容)。

标签: c++ arrays visual-c++ dimension


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 小拼写修复:constexpr
  • @DerekT.Jones,锐利的眼睛。它已修复。
【解决方案2】:

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

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。
  • @DerekT.Jones 不再。
  • 是的,现在是更好的例子!谢谢。
【解决方案3】:

标记const 本身并不能使其成为constant expression。它使它成为只读的。语句的右侧应满足 constexpr function 要求,而 strlen(plainString) 表达式不满足。您可以创建自己的函数,在编译时进行评估:

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

并改用它:

constexpr size_t patternLength = constexprlength(plainString);
int partialMatch[patternLength];

VLA 和字符数组是邪恶的。请改用std::vectorstd::string

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多