6

次のように定義されている _T(x) を使用する UNICODE アプリケーションがあります。

#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif

L は、どのプラットフォームでも 4 バイトになる wchar_t に定義されることを理解しています。間違っている場合は修正してください。私の要件は、L を 2 バイトにする必要があるということです。そのため、コンパイラのハックとして、-fshort-wchar gcc フラグの使用を開始しました。しかし今、アプリケーションを zSeries に移動する必要があり、そのプラットフォームで -fshort-wchar フラグの効果を確認できません。

アプリケーションを zSeries に移植できるようにするには、L ##x を使用した後でも -fshort-wchar フラグを使用せずに 2 バイト幅の文字を取得する必要があるように、_T( ) マクロを変更する必要があります。アプリケーションで常に L を 2 バイトに定義できるように、L の定義を変更する方法を教えてください。

4

2 に答える 2

5

できません - c++0x のサポートなしではできません。c++0x は、文字列リテラルを宣言する次の方法を定義します。

  • 「何らかの実装で定義されたエンコーディングでの char 文字の文字列」 - char
  • u8"utf8 文字の文字列" - char
  • u"utf16 文字の文字列" - char16_t
  • U"utf32 文字の文字列" - char32_t
  • L"一部の実装で定義されたエンコーディングでの wchar_t の文字列" - wchar_t

c++0x が広くサポートされるまで、utf-16 文字列をクロスプラットフォームでエンコードする唯一の方法は、ビットに分割することです。

// make a char16_t type to stand in until msvc/gcc/etc supports
// c++0x utf string literals
#ifndef CHAR16_T_DEFINED
#define CHAR16_T_DEFINED
typedef unsigned short char16_t;
#endif

const char16_t strABC[] = { 'a', 'b', 'c', '\0' };
// the same declaration would work for a type that changes from 8 to 16 bits:

#ifdef _UNICODE
typedef char16_t TCHAR;
#else
typedef char TCHAR;
#endif
const TCHAR strABC2[] = { 'a', 'b', 'b', '\0' };

_T マクロは、wchar_t が 16 ビット幅のプラットフォームでのみ商品を配信できます。また、代替手段はまだ真のクロスプラットフォームではありません。char と wchar_t のコーディングは実装定義であるため、「a」は必ずしも「a」の Unicode コードポイント (0x61) をエンコードするとは限りません。したがって、厳密に言えば、これが文字列を記述する唯一の方法です。

const TCHAR strABC[] = { '\x61', '\x62', '\x63', '\0' };

これはただ恐ろしいです。

于 2010-11-09T11:56:47.590 に答える
0

ああ!移植性の素晴らしさ:-)

すべてのプラットフォームにC99コンパイラを使用している場合は、、、int_least16_t... uint_least16_tfromを使用してください<stdint.h>。ほとんどのプラットフォームも定義しますint16_tが、存在する必要はありません(プラットフォームが一度に正確に16ビットを使用できる場合は、typedefint16_tを定義する必要があります)。

次に、すべての文字列をの配列でラップし、コードがの値が65535でラップuint_least16_tすることを期待していないことを確認します...uint_least16_t

于 2010-11-09T11:58:23.470 に答える