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

Joe*_*Joe 27 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" ) );
Run Code Online (Sandbox Code Playgroud)

我见过两者.为了清楚起见,_T似乎是为了简洁和_TEXT.这只是一个主观的程序员偏好还是比技术更具技术性?例如,如果我使用一个而不是另一个,我的代码是否会针对特定系统或某些旧版本的头文件进行编译?

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


小智 22

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

  • @STingRaySC:`_T`根本不会把你绑在微软身上.`#define _T(x)L ## x`你已经完成了. (15认同)
  • 如果你致力于MS,那就太棒了.使用他们所有的花哨的宏和语言扩展.使用`_T`意味着*某人*必须在将代码转换为任何其他平台*时更改代码.只有不成功的软件从未移植过...... (8认同)
  • +1用于提交Unicode; -1对于微软毫无意义的挖掘. (6认同)
  • 如果您正在编写_new_代码(即使在旧的代码库中),也绝对没有理由不总是使用`L""`.另一个习惯是显式调用宽函数,即使用`MessageBoxW`而不是`MessageBox`等 - 它确保代码无论编译方式如何都能正常工作.请记住,所有不支持Unicode API的MS操作系统都已不受支持.此外,非Unicode版本在任何NT OS上的效率都较低.当你需要支持9x时,不要忘记MSLU /`UnicoWS.dll`,这样你就可以继续使用Unicode了. (6认同)
  • 如果我们将当前的代码库移植到Linux,_T()将是我们最不担心的问题之一.编写替换宏是片刻的工作.从MFC转换为其他东西将花费更多的时间. (3认同)
  • 我要说他已经与Win32绑定了,如果要移植代码,当然必须解决这个问题,但是文本宏是一个*ADDITIONAL*要处理的事情.仅仅因为一方面不便携并不意味着所有赌注都已关闭. (2认同)

Ian*_*oyd 14

来自Raymond Chen:

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

没有下划线的普通版本会影响Windows头文件视为默认的字符集.因此,如果您定义UNICODE,那么GetWindowText将映射到GetWindowTextW而不是GetWindowTextA.类似地,TEXT宏将映射到L"..."而不是"...".

带有下划线的版本会影响C运行时头文件视为默认值的字符集.因此,如果您定义_UNICODE,那么_tcslen将映射到wcslen而不是strlen,例如.同样,_TEXT宏将映射到L"..."而不是"...".

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

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

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

_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");
Run Code Online (Sandbox Code Playgroud)

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


dir*_*tly 8

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

同样,_TEXT宏将映射到L"..."而不是"...".

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

  • 你遗漏了一个关键位:_TEXT("你好")== L"你好"只有在定义了UNICODE的情况下.是的,_T("你好")只是一个缩写. (3认同)

egr*_*nin 6

我从来没有见过有人用_TEXT()而不是_T().


Ter*_*fey 5

这些宏是应用程序实际上想要编译 unicode 和 ANSI 版本的时代遗留下来的。

今天没有理由这样做——这都是残余的。Microsoft 始终坚持支持所有可能的配置,但您却不然。如果您没有同时编译为 ANSI 和 Unicode(老实说,没有人这样做),只需使用 L"text"。

是的,以防现在还不清楚:_T == _TEXT