LPCSTR, LPCTSTR и LPTSTR



какая разница между LPCSTR,LPCTSTR и LPTSTR?



почему мы должны сделать это, чтобы преобразовать строку в LV/_ITEM структура переменной pszText:



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

5 ответов:

чтобы ответить на первую часть вашего вопроса:

LPCSTR - это строка const

LPCTSTR это const TCHAR строку (TCHAR будучи либо широким char или char в зависимости от того, определен ли UNICODE в вашем проекте)

LPTSTR в (не-const) TCHAR строка

это большая статьи codeproject описание строк C++ (см. 2/3 пути вниз для диаграммы, сравнивающей различные типы)

быстро и грязно:

LP ==LОнг Pointer. Просто подумайте указатель или символ*

C = Const, в этом случае я думаю, что они означают, что символьная строка является const, а не указатель const.

STR и строка

the T для широкого символа или char (TCHAR) в зависимости от параметров компиляции.

8-битные AnsiStrings

  • char: 8 - битный символ-базовый тип данных C / C++
  • CHAR: псевдоним char - тип данных Windows
  • LPSTR: null-завершенной строку CHAR(LОнг Pointer)
  • LPCSTR: константа null-завершенной строку CHAR(LОнг Pointer)

16-бит UnicodeStrings

  • wchar_t: 16-битный символ-базовый тип данных C / C++
  • WCHAR: псевдоним wchar_t - тип данных Windows
  • LPWSTR: null-завершенной строку WCHAR(LОнг Pointer)
  • LPCWSTR: константа null-завершенной строку WCHAR(LОнг Pointer)

в зависимости от UNICODE определить

  • TCHAR: псевдоним WCHAR если UNICODE определен; в противном случае CHAR
  • LPTSTR: null-завершенной строку TCHAR(LОнг Pointer)
  • LPCTSTR: константа null-завершенной строку TCHAR(LОнг Pointer)

так

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

Бонус Чтение

TCHAR Текстовый Символ

добавление к ответу Джона и Тима.

Если вы не кодируете для Win98, есть только два из 6 + строковых типов, которые вы должны использовать в своем приложении

  • LPWSTR
  • LPCWSTR

остальные предназначены для поддержки платформ ANSI или двойных компиляций. Сегодня они уже не так актуальны, как раньше.

чтобы ответить на вторую часть вашего вопроса, вам нужно сделать такие вещи, как

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

потому что МС это LVITEM структура имеет LPTSTR, т. е. a mutable t-стринги указатель, а не LPCTSTR. То, что вы делаете

1) преобразование string (a CString на догадку) в LPCTSTR (что на практике означает получение адреса его символьного буфера в качестве указателя только для чтения)

2) преобразуйте этот указатель только для чтения в записываемый указатель отбросив его const-Несс.

это зависит от того, что dispinfo используется для того, есть ли шанс, что ваши ListView звонок будет в конечном итоге пытается написать через pszText. Если это так, это потенциально очень плохо: в конце концов, вам дали указатель только для чтения, а затем решили рассматривать его как записываемый: возможно, есть причина, по которой он был доступен только для чтения!

если это CString вы работаете с вами есть возможность использовать string.GetBuffer() -- это намеренно дает вам возможность писать LPTSTR. Тогда вы должны помнить, чтобы позвонить ReleaseBuffer() если строка будет изменена. Или вы можете выделить локальный временный буфер и скопировать строку туда.

99% времени это будет ненужным и лечения LPCTSTR как LPTSTR будет работать... но однажды, когда ты меньше всего этого ожидаешь...

Comments

    Ничего не найдено.