我应该在C ++字符串文字上使用_T或_TEXT吗?

时间:2010-01-15 20:32:38

标签: c++ winapi backwards-compatibility literals

例如:

// 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。这只是一个主观的程序员偏好还是比技术更具技术性?例如,如果我使用一个而不是另一个,我的代码是否会针对特定系统或某个旧版本的头文件进行编译?

8 个答案:

答案 0 :(得分:23)

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(),但它(最终)也会扩展到同样的东西。

答案 1 :(得分:21)

提交Unicode并使用L"My String Literal"

答案 2 :(得分:14)

来自Raymond Chen

  

TEXT vs. _TEXT vs. _T,UNICODE vs. _UNICODE

     

没有的简单版本   下划线影响字符集   Windows头文件视为   默认。所以如果你定义UNICODE,   然后GetWindowText将映射到   GetWindowTextW而不是   例如,GetWindowTextA。   同样,TEXT宏将映射到   L“......”而不是“......”。

     

带下划线的版本   影响C运行时的字符集   头文件视为默认值。因此,如果   你定义_UNICODE,然后_tcslen将   映射到wcslen而不是strlen,for   例。同样,_TEXT宏   将映射到L“...”而不是“......”。

     

_T怎么样?好的,我不知道   关于那个。也许只是为了   保存某人打字。

简短版本:_T()是一个懒惰的人_TEXT()

注意:您需要了解编写源代码文本编辑器时使用的代码页:

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

编译器看到的字节取决于编辑器的代码页。

答案 3 :(得分:8)

Here是一个来自知名和受人尊敬的消息来源的有趣读物。

  

同样,_TEXT宏将映射到L“...”而不是“...”。

     

_T怎么样?好的,我不知道那一个。也许只是为了节省一些打字的人。

答案 4 :(得分:6)

我从未见过有人使用_TEXT()代替_T()

答案 5 :(得分:4)

都不是。根据我的经验,有两种基本类型的字符串文字,那些是不变的,以及那些在代码本地化时需要翻译的字符串文字。

在编写代码时区分这两个代码非常重要,这样您就不必再回过头来找出哪个代码。

所以我使用_UT()表示不可翻译的字符串,使用ZZT()(或其他易于搜索的字符串)表示需要翻译的字符串。代码中_T()_TEXT()的实例是尚未正确分类的字符串文字的证据。

_UTZZT都是_TEXT

的#defined

答案 6 :(得分:4)

这些宏是从应用程序实际上想要编译unicode和ANSI版本的日子开始的。

今天没有理由这样做 - 这完全是残余的。微软始终坚持支持所有可能的配置,但事实并非如此。如果您没有同时编译ANSI和Unicode(并且没有人,那么说实话)只需使用L“text”。

是的,如果现在还不清楚:_T == _TEXT

答案 7 :(得分:-3)

既不使用,也请不要使用L“......”垃圾。 对所有字符串使用UTF-8,并在传递给microsoft API之前转换它们。