例如:
// 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。这只是一个主观的程序员偏好还是比技术更具技术性?例如,如果我使用一个而不是另一个,我的代码是否会针对特定系统或某个旧版本的头文件进行编译?
答案 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()
的实例是尚未正确分类的字符串文字的证据。
_UT
和ZZT
都是_TEXT
答案 6 :(得分:4)
这些宏是从应用程序实际上想要编译unicode和ANSI版本的日子开始的。
今天没有理由这样做 - 这完全是残余的。微软始终坚持支持所有可能的配置,但事实并非如此。如果您没有同时编译ANSI和Unicode(并且没有人,那么说实话)只需使用L“text”。
是的,如果现在还不清楚:_T == _TEXT
答案 7 :(得分:-3)
既不使用,也请不要使用L“......”垃圾。 对所有字符串使用UTF-8,并在传递给microsoft API之前转换它们。