Pregunta

En mi aplicación, estoy declarando una variable de cadena cerca de la parte superior de mi código para definir el nombre de mi clase de ventana que uso en mis llamadas para registrarclassex, createwindowex, etc. Ahora, sé que un LPCTSTR es un typedef y eventualmente lo hará Siga a un TCHAR (bueno, un char o wchar dependiendo de si se define unicode), pero me preguntaba si sería mejor usar esto:

static LPCTSTR szWindowClass = TEXT("MyApp");

O esto:

static const TCHAR szWindowClass[] = TEXT("MyApp");

Personalmente, prefiero el uso del LPCTSTR como proveniente de un fondo de JavaScript, PHP, C# que nunca consideré declarar una cadena como una variedad de caracteres.

Pero, ¿hay realmente alguna ventaja de usar una sobre la otra, o de hecho ni siquiera hace la diferencia sobre cuál elijo?

Gracias, en avanzado, por sus respuestas.

¿Fue útil?

Solución

Las dos declaraciones no son idénticas. El primero crea un puntero, el segundo una matriz de tchar. Es posible que la diferencia no sea evidente, porque una matriz se descompondrá en un puntero si intenta usarla, pero lo notará instantáneamente si intenta ponerlos en una estructura, por ejemplo.

La declaración equivalente a LPCTSTR es:

static const TCHAR * szWindowClass = TEXT("MyApp");

La "L" en LPCTSTR representa "Long", que no ha sido relevante desde la programación de Windows de 16 bits y puede ignorarse.

Otros consejos

Dado que las cadenas de Unicode son nativas de Windows NT, a menos que desee que su aplicación se ejecute en Windows 9x-nativo de ANSI, siempre use cadenas de características anchas (WCHAR o wchar_t tipos).

En relación con su pregunta, ambos formularios pueden parecer igual; pero se espera que ambos se asignen en la sección de cadena constante de su ejecutable, literales de cadena no son necesariamente modificables Cuando se usan como inicializadores de matriz.

por ejemplo: (de C FAQ, 16.6) El siguiente código puede bloquear:

char *p = "HELLO";
p[0] = 'H';

Por lo tanto, es mejor usarlo siempre:

char a[] = "HELLO";

De nuevo, de C FAQ:Una cadena literal se puede usar de dos maneras ligeramente diferentes. Como inicializador de matriz (como en la declaración de char a []), especifica los valores iniciales de los caracteres en esa matriz. En cualquier otro lugar, se convierte en una variedad de caracteres estática y no identificada, que puede almacenarse en la memoria de solo lectura, por lo que no puede modificarlo de manera segura. En un contexto de expresión, la matriz se convierte de inmediato en un puntero, como de costumbre (ver Sección 6), por lo que la segunda declaración inicializa P para apuntar al primer elemento de la matriz sin nombre.

http://linuxdude.com/steve_sumit/c-faq/q1.32.html

El formulario de matriz es preferible para literales de cadena de este tipo. Los datos y el código involucrado ocupan (muy, muy marginalmente) menos espacio, y la variable no se puede cambiar para apuntar en una cadena diferente. (De hecho, no hay variable en absoluto, solo un nombre para la dirección del primer char en la cadena: se comporta muy parecido a un valor literal a este respecto).

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