0

我只是从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
4

3 回答 3

3

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

于 2013-04-24T15:18:58.367 回答
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(微软不无论如何都要实现 C99,因此在其 C 模式下也没有 VLA)。

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

于 2013-04-24T15:20:19.513 回答
0

如果您想继续使用静态缓冲区(这更好,尽管我同意 Jerry 的观点,astd::vector是要走的路),请MB_LEN_MAX改用。

于 2013-04-24T15:22:26.523 回答