2010-11-09 6 views
5

Tengo aplicación UNICODE donde usamos _T (x) que se define de la siguiente manera._T() cambios de macro para datos de caracteres UNICODE

#if defined(_UNICODE) 
#define _T(x) L ##x 
#else 
#define _T(x) x 
#endif 

Entiendo que L se define como wchar_t, que tendrá 4 bytes en cualquier plataforma. Por favor, corríjame si estoy equivocado. Mi requisito es que necesito que L sea de 2 bytes. Así que como compilador de pirateo comencé a usar -fshort-wchar flag gcc. Pero ahora necesito que mi aplicación se mueva a zSeries, donde no puedo ver el efecto de la bandera -fshort-wchar en esa plataforma.

Para que yo pueda portar mi aplicación en zSeries, necesito modificar la macro _T() de tal manera que incluso después de usar L ## x y sin usar la bandera -fshort-wchar, necesito obtener datos de caracteres de 2 bytes de ancho. Puede que alguien me diga cómo puedo cambiar la definición de L para que pueda definir que L sea de 2 bytes siempre en mi aplicación.

+3

yo sepa, wchar_t es 2 bytes de ancho en Windows, por lo que el tamaño de wchar_t es la implementación dependiente. – nothrow

+1

'wchar_t' se usa normalmente como el tipo de base para' WCHAR', que ciertamente tiene 2 bytes de ancho. Las funciones como 'MessageBoxW' tienen argumentos' WCHAR * ', por lo que tener' WCHAR' y 'wchar_t' idénticos hace que la programación de Windows sea mucho más fácil. – MSalters

+0

L es solo el caracter 'L'. No se define para ser nada. En C++, L "hello world" solo define un * string string literal *. Pero la L no es reemplazada por nada. – jalf

Respuesta

5

No se puede, sin compatibilidad con C++ 0x. C++ 0x define las siguientes formas de declarar literales de cadena:

  • "cadena de caracteres de carbonilla en alguna aplicación definido codificación" - Char
  • U8 "Cadena de caracteres UTF-8" - charla
  • u "string de caracteres UTF16" - char16_t
  • U "cadena de caracteres utf32" - char32_t
  • L "cadena de wchar_t de alguna aplicación definido codificación" - wchar_t

Hasta C++ 0x es ampliamente apoyado, la única manera para codificar una cadena UTF-16 de una manera multiplataforma es dividirla en los bits:

// make a char16_t type to stand in until msvc/gcc/etc supports 
// c++0x utf string literals 
#ifndef CHAR16_T_DEFINED 
#define CHAR16_T_DEFINED 
typedef unsigned short char16_t; 
#endif 

const char16_t strABC[] = { 'a', 'b', 'c', '\0' }; 
// the same declaration would work for a type that changes from 8 to 16 bits: 

#ifdef _UNICODE 
typedef char16_t TCHAR; 
#else 
typedef char TCHAR; 
#endif 
const TCHAR strABC2[] = { 'a', 'b', 'b', '\0' }; 

La macro _T sólo puede entregar las mercancías en plataformas donde wchar_t's tiene 16bits de ancho. Y, la alternativa aún no es realmente multiplataforma: la codificación de char y wchar_t es la implementación definida por lo que 'a' no codifica necesariamente el punto de código unicode para 'a' (0x61). Por lo tanto, para ser estrictamente preciso, esta es la única forma de escribir la cadena:

const TCHAR strABC[] = { '\x61', '\x62', '\x63', '\0' }; 

Lo que es simplemente horrible.

+0

Tenga en cuenta que en un IBM zSeries 'a' sigue siendo igual a' 0x61', pero 'j' no es' 0x6a'. – MSalters

0

¡Ah! Las maravillas de la portabilidad :-)

Si usted tiene un compilador C99 para todas sus plataformas, utilizan int_least16_t, uint_least16_t ... desde <stdint.h>. La mayoría de las plataformas también definen int16_t pero no es necesario que existan (si la plataforma es capaz de usar exactamente 16 bits a la vez, debe definirse typedef int16_t).

Ahora envuelva todas las cadenas en arrays de uint_least16_t y asegúrese de que su código no espera que los valores de uint_least16_t para envolver al 65535 ...

+0

No resuelve el problema; todavía no tiene forma de crear los literales 'const uint_least16_t []'. – MSalters

+1

Estoy usando el compilador GCC. ¿Hay algún otro indicador del compilador de GCC que no sea -fshort-wchar para cambiar el tamaño de wchar_t? –

+0

@MSalters: 'const uint_least16_t data [] = {'f', 'o', 'o', 'b', 'a', 'r', '\ 0'};' – pmg

Cuestiones relacionadas