2011-04-14 9 views
5

Cuando se construye una aplicación en Windows utilizando TCHAR apoyo, en %s_tprintf() significa char * cadena para ANSI construye y construye wchar_t * para Unicode mientras %S significa lo contrario.¿Hay un especificador de formato que siempre signifique cadena de caracteres con _tprintf?

¿Pero hay especificadores de formato que siempre signifiquen cadena char * sin importar si es una compilación Ansi o Unicode? Dado que incluso en Windows UTF-16 no se usa realmente para archivos o redes, sigue siendo bastante frecuente que quiera tratar con cadenas basadas en bytes, independientemente del tipo de caracteres nativos con los que compile su aplicación.

Respuesta

4

El El modificador h obliga tanto a %s como a %S a char*, y el modificador l fuerza ambos a wchar_t*, es decir: %hs, %hS, %ls y %lS.

+0

¿Es esta específica a MSVC? Acabo de notar esta advertencia de gcc en Ubuntu 10: 'advertencia: uso del modificador de longitud 'h' con carácter de tipo 's' – hippietrail

+0

No, no es específico de MSVC, algunos otros compiladores admiten' h' y 'l' modificadores para el tipo 's' también. Supongo que gcc no es uno de ellos. –

+0

Acabo de probar esto con gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 - funciona, más o menos. – 18446744073709551615

0

Usted puede escribir algo como esto:

#ifdef _UNICODE 
#define PF_ASCIISTR "%S"L 
#define PF_UNICODESTR "%s"L 
#else 
#define PF_ASCIISTR "%s" 
#define PF_UNICODESTR "%S" 
#endif 

y luego utiliza los PF_ASCIISTR o los PF_UNICODESTR macros en su cadena de formato, la explotación de la C literales de cadena automática concatenación:

_tprintf(_T("There are %d ") PF_ASCIISTR _T(" over the table"), 10, "pens"); 
1

Esto también podría resolver su problema:

_TCHAR *message; 
_tprintf(_T("\n>>>>>> %d") TEXT(" message is:%s\n"),4,message); 
Cuestiones relacionadas