web-dev-qa-db-ja.com

C ++文字列リテラルで_Tまたは_TEXTを使用する必要がありますか?

例えば:

// 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は明確にするためのようです。これは単に主観的なプログラマーの好みですか、それともそれよりも技術的ですか?たとえば、一方を他方の上に使用した場合、コードは特定のシステムまたは古いバージョンのヘッダーファイルに対してコンパイルされませんか?

27
Joe

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()を使用する必要がありますが、(最終的には)同じことにも拡張します。

23
i_am_jorf

Unicodeにコミットし、L"My String Literal"を使用します。

21
user123456

から レイモンドチェン

TEXT vs. _TEXT vs. _T、およびUNICODE vs. _UNICODE

アンダースコアのないプレーンバージョンは、Windowsヘッダーファイルがデフォルトとして扱う文字セットに影響します。したがって、UNICODEを定義すると、たとえばGetWindowTextはGetWindowTextAではなくGetWindowTextWにマップされます。同様に、TEXTマクロは「...」ではなくL「...」にマップされます。

アンダースコアの付いたバージョンは、Cランタイムヘッダーファイルがデフォルトとして扱う文字セットに影響します。したがって、_UNICODEを定義すると、たとえば、_tcslenはstrlenではなくwcslenにマップされます。同様に、_TEXTマクロは「...」ではなくL「...」にマップされます。

_Tはどうですか?さて、私はそれについて知りません。多分それは誰かにタイピングを節約するためだけだったのでしょう。

短いバージョン:_T()は怠惰な男の_TEXT()です

注:以下を作成するときは、ソースコードテキストエディタが使用しているコードページに注意する必要があります。

_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");

コンパイラーが認識するバイトは、エディターのコードページによって異なります。

14
Ian Boyd

ここ は、有名で尊敬されている情報源からの興味深い読み物です。

同様に、_TEXTマクロは「...」ではなくL「...」にマップされます。

_Tはどうですか?さて、私はそれについて知りません。多分それは誰かにタイピングを節約するためだけだったのでしょう。

8
dirkgently

_TEXT()の代わりに_T()を使用している人を見たことがありません。

6
egrunin

これらのマクロは、アプリケーションが実際にUnicodeバージョンとANSIバージョンの両方をコンパイルしたいと思っていた時代からの遺物です。

今日これを行う理由はありません-これはすべて痕跡です。マイクロソフトは、考えられるすべての構成を永久にサポートすることに固執していますが、そうではありません。 ANSIとUnicodeの両方にコンパイルしていない場合(そして誰もコンパイルしていない場合は、正直に言ってください)、L "text"を使用してください。

そして、はい、それが今までに明確でなかった場合に備えて:_T == _TEXT

4
Terry Mahaffey

どちらでもない。私の経験では、文字列リテラルには2つの基本的なタイプがあります。不変のものと、コードをローカライズするときに変換する必要があるものです。

コードを書くときに2つを区別することが重要です。そうすれば、戻ってどちらが後でどちらかを判断する必要がなくなります。

そのため、翻訳できない文字列には_UT()を使用し、翻訳が必要な文字列にはZZT()(または検索しやすいもの)を使用します。コード内の_T()または_TEXT()のインスタンスは、まだ正しく分類されていない文字列リテラルの証拠です。

_UTZZTは両方とも_TEXTに#definedです

4
John Knoeller