3

Visual Studio 2005を使用してプリプロセッサマクロで置き換えられたchar文字列リテラルをwchar_t文字列に変換する標準マクロはありますか?

例:これは機能します:

wchar_t* test = L"Hello World";

しかし、これはしません:

#define HELLOWORLD "Hello World"
wchar_t* test = L(HELLOWORLD);

多くの国際化された文字列を含むヘッダーファイルを、さまざまなプラットフォーム上のいくつかの異なるプロジェクトと共有しているので、ヘッダー自体を変更したり、プラットフォームに依存するため_T()を追加したりしたくありません。したがって、Unicode変換をヘッダーではなく、ソースに含める必要があります。ここに示すように独自の置換マクロを記述できることは知っていますが、VSに標準的な方法があるかどうか疑問に思っていますか?

これは、国際化されたコードを作成する人にとっては非常に一般的なシナリオのように思われますが、VS2005で提供される事前定義されたマクロを見つけることができないようです。

4

2 に答える 2

1

私は同様の問題を抱えていて、この解決策を思いつきました:

#define HELLOWORLD "Hello World"
const wchar_t* test = L"" HELLOWORLD;

これをGCC7でテストしました。そこでは、変換(ワイドから文字へ)関数が機能することを確認する必要がありました。

これは他のコンパイラでも機能すると確信しています。古いものでも、複数行のコメントを書くための機能が必要です。しかし、空の文字列リテラルの使用について文句を言うかもしれません。

于 2019-09-19T10:13:11.080 に答える
0

いいえ、このための「標準」マクロはありません。標準では、幅の広い文字列の前にanを付け、L幅の狭い文字列から接頭辞を省略します。

このようなマクロが存在する必要がある唯一の理由は、Unicodeをサポートしていないプラットフォームをさまざまにターゲットにしている場合です。その場合、すべてが細い文字列である必要があります。Unicodeをサポートしていないプラットフォームを扱っていない場合は、すべてが常に幅の広い文字列である必要があります。

_Tおよびマクロは、TEXTまさにこの目的のためにWindowsヘッダーで提供されます。UnicodeをサポートするWindowsNTとUnicodeをサポートしないWindows9xの両方でコンパイルできる単一のコードベースを維持します。

Windowsヘッダーがまだ含まれていない場合に、なぜこのようなマクロが必要になるのか想像できませんが、含まれている場合は、自分で作成するのは非常に簡単です。ただし、文字列リテラルを幅の広い文字列にする必要がある場合と、幅の狭い文字列にする必要がある場合を知る必要があります。これにも「標準」#defineはありません。WindowsヘッダーはUNICODEプリプロセッサシンボルを使用しますが、これが他のプラットフォームで定義されていることを信頼することはできません。これで、元の場所に戻ります。

なぜあなたはこれのためにマクロが必要だと思いますか?文字列のタイプをとしてハードコーディングする場合は、常にワイド文字リテラルを使用する必要があるため、常にプレフィックスを使用する必要がありwchar_t*ます。L

_TWindowsヘッダーのマクロやマクロを使用している場合TEXTは、文字列の種類を。としてハードコーディングしていませんwchar_t*。代わりに、シンボルTCHARの定義に応じて適切な文字タイプに自動的に解決されるマクロを使用しています。UNICODE

于 2012-08-09T02:16:26.110 に答える