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"
.
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)
编译器看到的字节取决于编辑器的代码页.
这些宏是应用程序实际上想要编译 unicode 和 ANSI 版本的时代遗留下来的。
今天没有理由这样做——这都是残余的。Microsoft 始终坚持支持所有可能的配置,但您却不然。如果您没有同时编译为 ANSI 和 Unicode(老实说,没有人这样做),只需使用 L"text"。
是的,以防现在还不清楚:_T == _TEXT