Какая разница между LPCSTR
, LPCTSTR
и LPTSTR
?
Зачем это нужно делать, чтобы преобразовать строку в переменную LV
/ _ITEM
structure pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
c++
windows
visual-c++
mfc
ничего Мастер
источник
источник
Ответы:
Чтобы ответить на первую часть вашего вопроса:
LPCSTR
указатель на константную строку (LP означает длинный указатель )LPCTSTR
является указателем наconst TCHAR
строку (TCHAR
является либо широким символом, либо символом, в зависимости от того, определен ли UNICODE в вашем проекте)LPTSTR
указатель на (неконстантную)TCHAR
строкуНа практике, когда мы говорили об этом в прошлом, для простоты мы не использовали фразу «указатель на», но, как упоминалось в lightness-races-in-orbit, все они являются указателями.
Это отличная статья по проекту кода, описывающая строки C ++ (см. 2/3 пути вниз для диаграммы, сравнивающей различные типы)
источник
extern "C"
. Кроме того, да, ему определенно нужен либо бит "указатель", либо конкретное описание в виде строки C.Быстро и грязно:
LP
== L Ong P ointer. Просто подумайте, указатель или символ *C
= C onst, в этом случае, я думаю, они имеют в виду, что символьная строка является константой, а не указателем, являющимся константой.STR
является строкаT
для широкого характера или полукокса (TCHAR) в зависимости от параметров компиляции.источник
8-битные строки AnsiStrings
char
: 8-битный символ - базовый тип данных C / C ++CHAR
: alias ofchar
- Тип данных WindowsLPSTR
: Завершается нулем строкаCHAR
( L Ong P ointer)LPCSTR
: Константа завершается нулем строкаCHAR
( L Ong P ointer)16-битные UnicodeStrings
wchar_t
: 16-битный символ - базовый тип данных C / C ++WCHAR
: alias ofwchar_t
- Тип данных WindowsLPWSTR
: Завершается нулем строкаWCHAR
( L Ong P ointer)LPCWSTR
: Константа завершается нулем строкаWCHAR
( L Ong P ointer)в зависимости от
UNICODE
определенияTCHAR
: псевдоним,WCHAR
если определен UNICODE; в противном случаеCHAR
LPTSTR
: Завершается нулем строкаTCHAR
( L Ong P ointer)LPCTSTR
: Константа завершается нулем строкаTCHAR
( L Ong P ointer)Так
Бонусное чтение
TCHAR
→ Текстовый символ ( archive.is )источник
Добавление к ответу Джона и Тима.
Если вы не пишете код для Win98, есть только два строковых типа из 6+, которые вы должны использовать в своем приложении.
LPWSTR
LPCWSTR
Остальные предназначены для поддержки платформ ANSI или двойной компиляции. Сегодня это уже не так актуально, как раньше.
источник
std::string
потому что это все еще строка на основе ASCII и предпочитаюstd::wstring
.*A
совместимости версий WinAPI с кодовой страницей UTF-8, они внезапно стали намного более актуальными. ; PЧтобы ответить на вторую часть вашего вопроса, вам нужно сделать что-то вроде
поскольку
LVITEM
структура MS имеетLPTSTR
, то есть изменяемый указатель T-строки, а неLPCTSTR
. Что ты делаешь1) преобразовать
string
(CString
предположительно) вLPCTSTR
(что на практике означает получение адреса его символьного буфера как указателя только для чтения)2) преобразовать этот доступный только для чтения указатель в записываемый указатель, отбросив его
const
сущность.Это зависит от того,
dispinfo
для чего используется, есть ли вероятность, что вашListView
звонок в конечном итоге попытается написать через этоpszText
. Если это так, то это потенциально очень плохо: в конце концов, вам дали указатель только для чтения, а затем вы решили рассматривать его как доступный для записи: возможно, есть причина, по которой он был доступен только для чтения!Если это
CString
то, с чем вы работаете, у вас есть возможность использоватьstring.GetBuffer()
- это намеренно дает вам возможность записиLPTSTR
. Затем вы должны не забыть позвонить,ReleaseBuffer()
если строка действительно изменилась. Или вы можете выделить локальный временный буфер и скопировать туда строку.В 99% случаев в этом нет необходимости, и обращение с этим
LPCTSTR
какLPTSTR
сработает ... но однажды, когда вы меньше всего этого ожидаете ...источник
xxx_cast<>()
вместо него.xxx_cast<>
вместо смешивания двух разных стилей приведения на основе скобок!