为什么MB_CUR_MAX未定义?

时间:2013-04-24 15:07:40

标签: c++

我只是从cplusplus复制一些代码,然后运行wctomb的测试程序:

/* wctomb example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* wctomb, wchar_t(C) */

int main() {
  const wchar_t str[] = L"wctomb example";
  const wchar_t* pt;
  char buffer [MB_CUR_MAX];
  int i,length;

  pt = str;
  while (*pt) {
    length = wctomb(buffer,*pt);
    if (length<1) break;
    for (i=0;i<length;++i) printf ("[%c]",buffer[i]);
    ++pt;
  }

  return 0;
}

但是,无法编译程序,因为考虑到我的编译器(VC 2010),MB_CUR_MAX未定义。我想知道我该怎么做。谢谢!

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'buffer' : unknown size

3 个答案:

答案 0 :(得分:3)

MB_CUR_MAX被定义为函数调用#define MB_CUR_MAX ___mb_cur_max_func(),因此您必须计算它的运行时并动态分配数组。

答案 1 :(得分:3)

与许多预处理器定义的数字不同,MB_CUR_MAX 必须是常量。事实上,由于它依赖于语言环境,我不确定它是否可以是编译时常量。

MS将其定义为:

#ifndef MB_CUR_MAX
#define MB_CUR_MAX ___mb_cur_max_func()

您在上面提供的代码在C99或C11中是合法的,其中char buffer [MB_CUR_MAX];将是一个可变长度数组 - 但是基于该标记,您正在尝试编译它作为C ++,它不包括VLA(并且Microsoft无论如何都没有实现C99,因此也没有C语言中的VLA)。

如果您要编译为C ++,您可能希望将其从数组更改为std::vector,因此指定不是编译时常量的大小不再是问题。< / p>

答案 2 :(得分:0)

如果你想继续使用静态缓冲区(这更好,虽然我同意Jerry认为std::vector是要走的路),但请改用MB_LEN_MAX