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?

¿Fue útil?

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".

Raymond Chen :

  

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top