我只是从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
答案 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
。