私はC ++文字列リテラルに_Tまたは_TEXTを使用する必要がありますか?
-
20-09-2019 - |
質問
例
// This will become either SomeMethodA or SomeMethodW,
// depending on whether _UNICODE is defined.
SomeMethod( _T( "My String Literal" ) );
// Becomes either AnotherMethodA or AnotherMethodW.
AnotherMethod( _TEXT( "My Text" ) );
私は両方を見てきました。 _Tでは、わかりやすくするために、簡潔かつ_TEXTためのようです。これは単に主観的なプログラマの好みであるか、それはそれ以上の技術的なのですか?私は他の上のいずれかを使用している場合たとえば、私のコードは、特定のシステムまたはヘッダファイルの一部の古いバージョンに対してコンパイルしないのだろうか?
解決
SDKの簡単なgrepのは、私たちを示して答えがあることであるとのそれは問題では、彼らはありませんのと同じです。これらは両方とも__T(x)
に変わります。
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h crt\src\tchar.h:2439:#define _T(x) __T(x) include\tchar.h:2390:#define _T(x) __T(x) C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h crt\src\tchar.h:2440:#define _TEXT(x) __T(x) include\tchar.h:2391:#define _TEXT(x) __T(x)
万全を期すために:
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h crt\src\tchar.h:210:#define __T(x) L ## x crt\src\tchar.h:889:#define __T(x) x include\tchar.h:210:#define __T(x) L ## x include\tchar.h:858:#define __T(x) x
ただし、の技術的の、C ++のためにあなたはTEXT()
の代わりに_TEXT()
を使用する必要がありますが、それは(最終的に)あまりにも同じことに展開されます。
他のヒント
Unicodeにコミットし、ちょうどL"My String Literal"
を使用します。
TEXT対_TEXT対_T、および_UNICODE対UNICODE
のない無地のバージョン アンダースコアは文字セットに影響を与えます Windowsのヘッダファイルは、として扱います デフォルト。だから、UNICODEを定義した場合、 その後、GetWindowTextはにマッピングされます 代わりのGetWindowTextW 例えばGetWindowTextA、。 同様に、TEXTマクロにマッピングされ L "..." の代わりに "..."。
アンダースコアとバージョン Cランタイム文字セットに影響を与えます ヘッダファイルは、デフォルトとして扱います。もしそうなら あなた_tcslen意志そして、_UNICODEを定義します 以下のために、strlenをするのではなくたwcslenするマップ 例。同様に、_TEXTマクロ 「...」「...」Lにマップの代わりになります。
_Tについては何?さて、私は知りません その約1。多分それはちょうどにしました 誰かにいくつかの入力を保存します。
ショートバージョン:_T()
は怠惰な人間の_TEXT()
です。
注:あなたが書くとき、あなたはあなたのソースコードのテキストエディタを使用しているもののコード・ページを認識する必要があります:
_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");
コンパイラが見ているバイトは、エディタのコードページに依存します。
ここの面白い読み取りよく知られており、尊敬ソースます。
同様に、_TEXTマクロがLにマッピングする "..." の代わりに "..."
_Tについては何?さて、私はその1つのことは知りません。多分それはちょうど誰かにいくつかのタイピングを保存することでした。
私は誰が代わりに_TEXT()
の_T()
を使用し見たことがありません。
どちらも。私の経験では、文字列リテラルの2つの基本的なタイプ、不変なもの、そしてあなたのコードがローカライズされたときに変換する必要があるものがあります。
あなたが戻ってくると、後でこれはどの把握する必要はありませんので、それはあなたがコードを書くように2つを区別することが重要です。
だから私は翻訳不可能な文字列の_UT()
、および翻訳する必要があります文字列にZZT()
(またはで検索しやすい何か他のもの)を使用します。コード内_T()
または_TEXT()
のインスタンスは、まだ正しく分類されていない文字列リテラルの証拠です。
_UT
とZZT
は両方_TEXTに、#defineで定義された
これらのマクロは、アプリケーションが実際にUnicodeとANSIバージョンの両方をコンパイルしたかったかもしれない日からホールドオーバーです。
今日これを行う理由はありません - これは、すべての痕跡です。 Microsoftは永遠にすべての可能な構成をサポートして立ち往生しているが、あなたはそうではありません。あなたはANSIとUnicodeの両方にコンパイルされていない場合は、単にL「テキスト」でに行く(と誰がではない、のは、正直言ってみましょう)。
そして、はい、場合には、それが今では明確ではありませんでした:_T == _TEXT
どちらも使用していない、ともL「...」がらくたを使用しないでください。 すべての文字列をUTF-8を使用して、ちょうどマイクロソフトのAPIに渡す前にそれらを変換ます。