我应该使用_T或_TEXT在C ++字符串文字?
-
20-09-2019 - |
题
例如:
// 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的清晰度。这仅仅是一种主观的程序员偏好或者是比更多的技术?举例来说,如果我使用了另一种,将我的代码无法编译针对特定系统或一些较旧版本的头文件?
解决方案
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()
,但(最终)扩展到同样的事情。
其他提示
提交到Unicode,只是使用L"My String Literal"
。
从雷蒙德陈:
TEXT与_TEXT与_T,和UNICODE与_UNICODE
在平原版本而不 下划线影响的字符集 Windows的头文件当作 默认。所以,如果你定义UNICODE, 那么GetWindowText函数将映射到 GetWindowTextW代替 GetWinowTextA的,例如。 同样,文本宏将映射到 L“......”代替“......”。
以下划线的版本 影响字符集的C运行时 头文件当作默认。因此,如果 你定义_UNICODE,然后_tcslen会 地图wcslen而不是strlen的,对于 例。同样,_TEXT宏 将映射到L“......”代替“......”。
有关_T什么?好吧,我不知道 关于那一个。也许这只是给 节省的人一些打字。
短版本:_T()
是一个懒惰的人的_TEXT()
请注意:你需要知道什么样的代码页源代码的文本编辑器使用的,当你写:
_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");
编译器看到的字节数取决于你的编辑器的代码页。
这里的一个有趣的从读公知的和尊敬的源。
类似地,_TEXT宏将映射到L “...”,而不是 “...”。
有关_T什么?好吧,我不知道这个问题的。也许这只是为了节省的人打字。
我从来没有见过任何人使用,而不是_TEXT()
_T()
。
都不是。根据我的经验,有两种基本类型的字符串文字的,那些是不变的,而那些需要在你的代码本地化翻译。
所以你不必回来,并找出哪些是后来很重要的,因为你写的代码区分两者。
于是我就用_UT()
为不可翻译的字符串,并ZZT()
(或别的东西,很容易搜索)了解,将需要翻译的字符串。在代码_T()
或_TEXT()
的实例是尚未被正确归类字符串文字的证据。
和_UT
ZZT
都#define的至_TEXT
这些宏是从天抱过来时,应用程序可能会其实是想编一个都Unicode和ANSI版本。
有没有理由这样做今天 - 这是所有残留。微软被套牢永远支持每一个可能的配置,但你不是。如果你没有编译到两个ANSI和Unicode(也没有人,说实话)只是去与L“文本”。
和是的,在情况下,它现在尚不清楚:_T == _TEXT
使用没有,也请不要使用L“...”废话。 使用UTF-8的所有字符串,并把它们刚好路过微软的API之前转换。