30

例えば:

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

4

8 に答える 8

24

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()が、(最終的には) 同じものに展開されます。

于 2010-01-15T21:21:52.350 に答える
21

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

于 2010-01-15T20:42:35.973 に答える
17

レイモンド・チェン より:

TEXT 対 _TEXT 対 _T、および UNICODE 対 _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.");

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

于 2010-01-15T21:23:29.807 に答える
8

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

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

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

于 2010-01-15T20:43:23.810 に答える
5

これらのマクロは、アプリケーションが実際に Unicode と ANSI の両方のバージョンをコンパイルする必要があった時代からの持ち越しです。

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

はい、まだはっきりしていない場合は、次のようにします: _T == _TEXT

于 2010-01-15T22:24:33.680 に答える
5

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

于 2010-01-15T20:34:17.100 に答える
4

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

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

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

_UT両方ともZZT_TEXT に #define されています

于 2010-01-15T21:10:27.357 に答える
-5

どちらも使用しないでください。また、L"..." がらくたを使用しないでください。すべての文字列に UTF-8 を使用し、Microsoft API に渡す直前に変換します。

于 2010-01-15T22:46:57.883 に答える