Question

Dans ma demande je suis déclarant une variable chaîne près du haut de mon code pour définir le nom de ma classe de fenêtre que je l'utilise dans mes appels à RegisterClassEx, CreateWindowEx etc .. Maintenant, je sais qu'un LPCTSTR est un typedef et finira par suivre jusqu'à un TCHAR (bien CHAR ou WCHAR selon que UNICODE est défini), mais je me demandais s'il serait préférable d'utiliser ceci:

static LPCTSTR szWindowClass = TEXT("MyApp");

Ou ceci:

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

Personnellement, je préfère l'utilisation du LPCTSTR comme provenant d'un JavaScript, PHP, C # fond j'ai jamais vraiment considéré la déclaration d'une chaîne comme un tableau de caractères.

Mais il y a effectivement des avantages de l'utilisation d'un sur l'autre, ou il ne en fait même pas faire une différence à laquelle je choisis?

Merci, à l'avance, pour vos réponses.

Était-ce utile?

La solution

Les deux déclarations ne sont pas identiques. Le premier crée un pointeur, la seconde une matrice de TCHAR. La différence pourrait ne pas être apparente, car un tableau se décompose en un pointeur si vous essayez de l'utiliser, mais vous remarquerez instantanément si vous essayez de les mettre dans une structure par exemple.

La déclaration équivalente à LPCTSTR est:

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

Le « L » dans LPCTSTR signifie « Long », qui n'a pas été pertinent puisque la programmation Windows et peut être ignoré 16 bits.

Autres conseils

Étant donné que les chaînes Unicode sont natifs de Windows NT, sauf si vous voulez que votre application à exécuter sur la norme ANSI natif Windows 9x, utilisez toujours des chaînes de caractères larges (WCHAR ou types wchar_t).

Par rapport à votre question, les deux formes peuvent semblent égal; mais les deux sont barbante devraient être attribués dans la section de chaîne constante de vos exécutables, les chaînes littérales ne sont pas nécessairement modifiables quand il est utilisé comme initialiseurs de tableau.

par exemple: (à partir de C Faq, 16.6) Le code suivant peut se bloquer:

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

Il est donc préférable de toujours utiliser:

char a[] = "HELLO";

Encore une fois, à partir de C Faq: Un littéral de chaîne peut être utilisée de deux façons légèrement différentes. A titre d'initialisation du réseau (comme dans la déclaration de char a []), on détermine les valeurs initiales des caractères dans ce tableau. Partout ailleurs, il se transforme en un tableau sans nom, statique de caractères, qui peuvent être stockés dans la mémoire en lecture seule, ce qui est la raison pour laquelle vous ne pouvez pas modifier en toute sécurité. Dans un contexte d'expression, la matrice est convertie en une seule fois à un pointeur, comme d'habitude (voir section 6), de sorte que la seconde déclaration initialise p du point de premier élément de réseau anonyme.

http://linuxdude.com/Steve_Sumit/C-faq/q1 .32.html

La forme de tableau est préférable pour les littéraux de chaîne de ce type. Les données et le code impliqué prend (très, très légèrement) moins d'espace, et la variable ne peut être changé à un point à une autre chaîne. (En fait, il n'y a pas de variable du tout, juste un nom pour l'adresse du premier caractère dans la chaîne -. Il se comporte très bien comme une valeur littérale à cet égard)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top