web-dev-qa-db-fra.com

LPCSTR, LPCTSTR et LPTSTR

Quelle est la différence entre LPCSTR, LPCTSTR et LPTSTR?

Pourquoi avons-nous besoin de faire cela pour convertir une chaîne en LV/_ITEM variable de structure pszText:

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
97
nothingMaster

Pour répondre à la première partie de votre question:

LPCSTR est une chaîne de const

LPCTSTR est un const TCHAR chaîne, (TCHAR étant soit un caractère large, soit un caractère selon que UNICODE est défini dans votre projet)

LPTSTR est une chaîne (non-constante) TCHAR

C’est un excellent article de codeproject décrivant les chaînes C++ (voir 2/3 en bas pour un tableau comparant les différents types)

111
John Sibly

Rapide et sale:

LP == L ong P ointer. Pensez simplement au pointeur ou au caractère *

C = C onst, dans ce cas, je pense qu'ils signifient que la chaîne de caractères est une chaîne const, et non le pointeur étant const.

STR est chaîne

le T est pour un caractère large ou char (TCHAR) en fonction des options de compilation.

82
Tim

AnsiStrings 8 bits

  • char: caractère 8 bits - type de données C/C++ sous-jacent
  • CHAR: alias de char - type de données Windows
  • LPSTR: chaîne de CHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)
  • LPCSTR: chaîne constante de CHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)

UnicodeStrings 16 bits

  • wchar_t: Caractère 16 bits - type de données sous-jacent C/C++
  • WCHAR: alias de wchar_t - Type de données Windows
  • LPWSTR: chaîne de WCHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)
  • LPCWSTR: chaîne constante de WCHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)

en fonction de UNICODE définir

  • TCHAR: alias de WCHAR si UNICODE est défini; sinon CHAR
  • LPTSTR: chaîne de TCHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)
  • LPCTSTR: chaîne constante de TCHAR terminée par le caractère null ( [~ # ~] l [~ # ~] ong [~ # ~] p [~ # ~] ointer)

Alors

| Item              | 8-bit        | 16-bit      | Varies          |
|-------------------|--------------|-------------|-----------------|
| character         | CHAR         | WCHAR       | TCHAR           |
| string            | LPSTR        | LPWSTR      | LPTSTR          |
| string (const)    | LPCSTR       | LPCWSTR     | LPCTSTR         |

Lecture bonus

TCHAR Caract. Texte ( archive.is )

23
Ian Boyd

Ajoutant à la réponse de John et Tim.

Sauf si vous codez pour Win98, il n'y a que deux des 6 types de chaînes que vous devriez utiliser dans votre application.

  • LPWSTR
  • LPCWSTR

Les autres sont destinés à prendre en charge les plates-formes ANSI ou les compilations doubles. Celles-ci ne sont plus aussi pertinentes aujourd'hui qu'elles l'étaient.

3
JaredPar

Pour répondre à la deuxième partie de votre question, vous devez faire des choses comme

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

parce que la structure LVITEM de MS a un LPTSTR, c'est-à-dire un pointeur mutable , pas un LPCTSTR. Ce que tu fais c'est

1) convertir string (un CString à une estimation) en un LPCTSTR (ce qui signifie en pratique obtenir l'adresse de son tampon de caractères sous la forme d'un pointeur en lecture seule)

2) convertissez ce pointeur en lecture seule en un pointeur inscriptible en supprimant son constness.

Cela dépend de ce que dispinfo est utilisé pour déterminer s’il existe ou non une chance que votre appel ListView finisse par essayer de écrire à travers ce pszText. Si c'est le cas, c'est potentiellement une très mauvaise chose: après tout, on vous a donné un pointeur en lecture seule, puis vous avez décidé de le traiter en écriture: il y a peut-être une raison pour laquelle il était en lecture seule!

Si vous travaillez avec CString, vous avez la possibilité d’utiliser string.GetBuffer() - pour vous donner délibérément un LPTSTR enregistrable. Vous devez alors vous rappeler d'appeler ReleaseBuffer() si la chaîne est modifiée. Ou vous pouvez allouer un tampon temporaire local et y copier la chaîne.

Cela sera inutile dans 99% des cas et traiter le LPCTSTR comme un LPTSTR fonctionnera ... mais un jour, quand on s'y attendra le moins ...

3
AAT