¿Debo usar _T o _TEXT en C ++ literales de cadena?
-
20-09-2019 - |
Pregunta
Por ejemplo:
// 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" ) );
He visto ambos. _T parece ser a la brevedad y _TEXT para mayor claridad. Se trata simplemente de una preferencia subjetiva programador o es más técnico que eso? Por ejemplo, si uso uno sobre el otro, será mi código se compila en contra de un sistema en particular o alguna versión anterior de un archivo de cabecera?
Solución
Un simple grep del SDK nos muestra que la respuesta es que no importa-que son los mismos . Ambos se convierten en __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)
Y está completo:
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
Sin embargo, técnicamente , para C ++ que usted debe utilizar en lugar de TEXT()
_TEXT()
, pero (con el tiempo) se expande a la misma cosa también.
Otros consejos
Se comprometen a Unicode y sólo tiene que utilizar L"My String Literal"
.
TEXTO vs vs _TEXT _T, y Unicode vs _UNICODE
Las versiones de fricción sin la el subrayado afectar el conjunto de caracteres los archivos de encabezado de Windows tratan como defecto. Así que si se define UNICODE, a continuación, se proyectará en GetWindowText GetWindowTextW en lugar de GetWindowTextA, por ejemplo. Del mismo modo, la macro TEXTO asignará a L "..." en lugar de "...".
Las versiones con el carácter de subrayado afectar el juego de caracteres del tiempo de ejecución de C archivos de cabecera tratan como predeterminado. Así que si definiría _UNICODE, a continuación, se _tcslen mapa para wcslen en lugar de strlen, por ejemplo. Del mismo modo, la macro _TEXT trazará un mapa de L "..." en lugar de "...".
¿Qué hay de _T? Está bien, no sé acerca de eso. Tal vez fue sólo para salvar a alguien algo de tecleo.
Versión corta: _T()
es _TEXT()
de un hombre perezoso
Nota: Tienes que ser consciente de lo que la página de códigos fuente editor de texto de código se usa cuando se escribe:
_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");
Los bytes que el compilador ve depende de la página de códigos de su editor.
Aquí 's una lectura interesante desde una bien conocida y respetada fuente.
Del mismo modo, la macro _TEXT asignará a L "..." en lugar de "...".
¿Qué hay de _T? Está bien, no sé acerca de eso. Tal vez fue sólo para salvar a alguien algo de tecleo.
Nunca he visto a nadie usar _TEXT()
en lugar de _T()
.
Ni. En mi experiencia hay dos tipos básicos de literales de cadena, los que son invariantes, y los que necesitan ser traducidos cuando se localiza su código.
Es importante distinguir entre los dos como se escribe el código por lo que no tiene que volver y averiguar cuál es el que más tarde.
Así que uso _UT()
para las cadenas no traducibles, y ZZT()
(o cualquier otra cosa que es fácil buscar en) para las cadenas que necesitarán ser traducido. Los casos de _T()
o _TEXT()
en el código son la evidencia de los literales de cadena que aún no se pueden clasificar correctamente.
_UT
y ZZT
están ambos #defined a _TEXT
Estas macros son un asimiento de los días cuando una aplicación podría haber hecho querido compilar tanto una versión ANSI y Unicode.
No hay ninguna razón para hacer esto hoy en día - esto es todo vestigio. Microsoft se ha quedado atascado con el apoyo a todas las configuraciones posibles para siempre, pero que no lo son. Si no está compilando a las normas ANSI y Unicode (y no hay nadie, seamos honestos) sólo tiene que ir a con L "texto".
Y sí, en caso de que no estaba claro por ahora: == _T _TEXT
Utilice tampoco, y también, por favor no utilice el L "..." porquería. Utilizar UTF-8 para todas las cadenas, y convertirlos justo antes de pasar a las API de Microsoft.