Это просто
строки ATL CString обеспечивают очень простое использование без делать много преобразований между типами. Вы можете легко сделать:
CString cs = "Test";
const char* str = static_cast<LPCTSTR>(cs);
или в среде UNICODE:
CString cs = "Test";
const wchar_t* str = static_cast<LPCTSTR>(cs);
Как это работает
static_cast
(или, альтернативно, C-стиль) вызовет CString::operator LPCTSTR
, так что вы не будете самостоятельно переинтерпретировать указатель но полагайтесь на код ATL!
В документации этого оператора приведения говорится:
Этот полезный оператор приведения обеспечивает эффективный метод доступа к строке C с завершающим нулем, содержащейся в объекте CString. Никакие символы не копируются; возвращается только указатель. Будьте осторожны с этим оператором. Если вы измените объект CString после получения указателя на символ, вы можете вызвать перераспределение памяти, которое сделает указатель недействительным.
Модифицируемые указатели
Как упоминалось в приведенном выше заявлении, возвращаемый оператором приведения указатель не предназначен для изменения. Однако, если вам по-прежнему необходимо использовать модифицируемый указатель для некоторых устаревших библиотек C, вы можете использовать const_cast
(если вы уверены, что функция не изменит указатель):
void Func(char* str) // or wchar_t* in Unicode environment
{
// your code here
}
// In your calling code:
CString cs = "Test";
Func(const_cast<LPTSTR>(static_cast<LPCTSTR>(test))); // Call your function with a modifiable pointer
Если вы хотите изменить указатель, вам не удастся выполнить какое-либо копирование памяти в изменяемую память, как упоминалось в других ответах.
person
Vinz
schedule
19.10.2016