¿Debo usar T o TEXT en literales de cadena de C++?


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 para la brevedad y _TEXT para la claridad. ¿Es esto simplemente una preferencia subjetiva del programador o es más técnico que eso? Por ejemplo, si uso uno sobre el otro, ¿mi código no se compilará contra un sistema en particular o alguna versión anterior de un archivo de encabezado?

Author: Joe, 2010-01-15

8 answers

Un simple grep del SDK nos muestra que la respuesta es que no importa, 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 para completar:

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++ deberías usar TEXT() en lugar de _TEXT(), pero (eventualmente) se expande a la misma cosa también.

 23
Author: i_am_jorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-10 17:51:00

Confírmese a Unicode y simplemente use L"My String Literal".

 21
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 20:49:11

De Raymond Chen :

TEXTO vs _TEXTOS vs _T, y UNICODE vs _UNICODE

Las versiones simples sin el el subrayado afecta al conjunto de caracteres los archivos de encabezado de Windows tratan como predeterminado. Así que si defines UNICODE, a continuación, GetWindowText se asignará a GetWindowTextW en lugar de GetWindowTextA, por ejemplo. Del mismo modo, la macro DE TEXTO se mapeará a L"..."en lugar de "...".

Las versiones con el subrayado afectar el carácter establecer el Tiempo de ejecución C los archivos de encabezado se tratan como predeterminados. Así que si define _UNICODE, entonces _tcslen mapa a wcslen en lugar de strlen, para ejemplo. Del mismo modo, la macro _TEXT se asignará a L"..."en lugar de "...".

¿Qué pasa con _T? Vale, no lo sé sobre eso. Tal vez fue sólo para guárdale a alguien algo de escribir.

Versión corta: _T() es el _TEXT()

Nota: Debe estar al tanto de qué página de código está utilizando su editor de texto de código fuente cuando escribe:

_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");

Los bytes que ve el compilador dependen de la página de código de su editor.

 14
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 21:28:46

Aquí es una lectura interesante de una fuente bien conocida y respetada.

Del mismo modo, la macro _TEXT se asignará a L"..."en lugar de "...".

¿Qué pasa con _T? Vale, no estoy seguro de eso. Tal vez fue sólo para ahorrarle a alguien algo de mecanografía.

 8
Author: dirkgently,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 20:43:23

Nunca he visto a nadie usar _TEXT() en lugar de _T().

 6
Author: egrunin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-02 18:56:29

Ninguno. En mi experiencia hay dos tipos básicos de literales de cadena, los que son invariantes, y los que necesitan ser traducidos cuando su código está localizado.

Es importante distinguir entre los dos a medida que escribe el código para que no tenga que volver y averiguar cuál es cuál más tarde.

Así que uso _UT() para cadenas intraducibles, y ZZT() (o algo más que sea fácil de buscar) para cadenas que necesitarán ser traducidas. Instancias de _T() o _TEXT() en el código hay evidencia de literales de cadena que aún no se han categorizado correctamente.

_UT y ZZT están #definidos a _TEXT

 4
Author: John Knoeller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 21:10:27

Estas macros son una retención de los días en que una aplicación podría haber querido compilar tanto una versión unicode como ANSI.

No hay razón para hacer esto hoy - todo esto es vestigial. Microsoft está atascado con el soporte de todas las configuraciones posibles para siempre, pero usted no lo está. Si no está compilando tanto para ANSI como para Unicode (y nadie lo está, seamos honestos), simplemente vaya con L"texto".

Y sí, en caso de que no estuviera claro por ahora: _T == _TEXT

 4
Author: Terry Mahaffey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 22:24:33

No use ninguno de los dos, y también por favor no use la L"..." mierda. Use UTF-8 para todas las cadenas y conviértalas justo antes de pasarlas a las API de Microsoft.

 -2
Author: Pavel Radzivilovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 22:46:57