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 は定数である必要はありません。実際、これはロケールに依存するため、コンパイル時の定数になるかどうかはわかりません。

MS は次のように定義しています。

#ifndef MB_CUR_MAX
#define MB_CUR_MAX ___mb_cur_max_func()

上記のコードは、可変長配列になるC99 または C11 では正当char buffer [MB_CUR_MAX];ですが、タグに基づいて、VLA を含まない C++ としてコンパイルしようとしています (そして、Microsoft は VLA を含みません)。とにかく C99 を実装するので、C モードの VLA もありません)。

C++ としてコンパイルする場合は、おそらくそれを配列から に変更したいstd::vectorので、コンパイル時の定数ではないサイズを指定することはもはや問題ではありません。

于 2013-04-24T15:20:19.513 に答える
3

MB_CUR_MAXは関数呼び出しとして定義され#define MB_CUR_MAX ___mb_cur_max_func()ているため、実行時に計算して配列を動的に割り当てる必要があります。

于 2013-04-24T15:18:58.367 に答える
0

静的バッファを使用し続けたい場合 (これはより良い方法ですが、astd::vectorを使用する方法があるという Jerry の意見に同意します)、MB_LEN_MAX代わりに使用してください。

于 2013-04-24T15:22:26.523 に答える