0

非常に奇妙な問題が発生しています...次の簡単なテストコードは、単一のCocoaアプリケーションに挿入された場合は正常に機能しますが、フレームワークの1つで使用すると、まったく予期しない結果が得られます...

wchar_t Buf[2048];
wcscpy(Buf, L"/zbxbxklbvasyfiogkhgfdbxbx/bxkfiorjhsdfohdf/xbxasdoipppwejngfd/gjfdhjgfdfdjkg.sdfsdsrtlrt.ljlg/fghlfg");
int len1 = wcslen(L"/zbxbxklbvasyfiogkhgfdbxbx/bxkfiorjhsdfohdf/xbxasdoipppwejngfd/gjfdhjgfdfdjkg.sdfsdsrtlrt.ljlg/fghlfg");
int len2 = wcslen(Buf);

char Buf2[2048];
Buf2[0]=0;
wcstombs(Buf2, Buf, 2048);

// ??? Buf2 == ""
// ??? len1 == len2 == 57, but should be 101


どうしてこれができるのか、私は怒ったのか?メモリが破損したとしても、スタックに割り当てられたこれらすべての値を破損する可能性はありません... wcslen(L "MyWideString")でさえ機能しないのはなぜですか?テスト文字列を変更するとその長さが変更されますが、常に間違っています。wcstombsは-1を返します。

setlocale()はどこにも使用されていません。移植を容易にするために、テスト文字列にはASCII文字のみが含まれています。-fshort-wcharコンパイラオプションを使用しますが、Cocoaアプリケーションのテストでは正常に機能します...

助けてください!

4

3 に答える 3

0

C / C ++でのワイド文字の実装は、1バイト、2バイト、4バイトなど何でもかまいません。これは、コンパイルするコンパイラとプラットフォームによって異なります。

おそらくウィキペディアは引用するのに最適な場所ではありませんが、この場合: http: //en.wikipedia.org/wiki/Wide_characterは次のように述べています

... wchar_tの幅はコンパイラ固有であり、8ビットまで小さくすることができます。

...歴史的な互換性の理由から、ワイド文字はC90では16ビット値である必要があります。10646-1:2000Unicode標準に準拠するCおよびC++コンパイラは、通常32ビット値を想定しています。

したがって、を想定して使用しないsizeof(wchar_t)でください。

于 2011-06-14T10:47:58.163 に答える
0

これをGCC4.6でもう一度テストしました。標準設定では、これは期待どおりに機能し、すべての長さに101が与えられます。ただし、オプション-fshort-wcharを使用すると、予期しない結果も発生します(私の場合は51、setlocale()を使用した後の最終変換では251)。

だから私はオプションの男性エントリを調べました:

警告:-fshort-wcharスイッチを使用すると、GCCは、そのスイッチなしで生成されたコードとバイナリ互換ではないコードを生成します。これを使用して、デフォルト以外のアプリケーションバイナリインターフェイスに準拠します。

それが説明していると思います。標準ライブラリにリンクするときは、正しいABIと型の規則を使用する必要があります。これは、そのオプションでオーバーライドします。

于 2011-06-20T21:54:09.873 に答える
0

-fshort-wcharコンパイラのABIを変更するため、wchar_tを使用してglibc、libgcc、およびすべてのライブラリを再コンパイルする必要があります。それ以外の場合、wlcslenおよびglibcの他の関数は、wchar_tが4バイトであると想定します。

参照: http: //gcc.gnu.org/bugzilla/show_bug.cgi?id = 42092

于 2012-03-27T08:29:33.603 に答える