2013-09-09 4 views
0

Учитываяесть какая-то разница между пропусканием CString и переходя CString.GetBuffer к% s в CString.Format

CString buffer = ""; 
Cstring value = "blah"; 

buffer.Format ("%s %s", value, value.GetBuffer()); 

является два способом пропускания CString эквивалента, или же прохождения CString есть что-то происходит за кулисами, что заставляет его быть эквивалентным?

+4

Справа от документов 'Format': * Не удалось выполнить вызов, если сам объект строки предлагается в качестве параметра для форматирования. * – chris

+1

Вы только хотите вызвать' GetBuffer', если вы должны обойти буфер CString управления и записи во внутренний буфер. Для каждого вызова 'GetBuffer' вам нужно вызвать' ReleaseBuffer', чтобы объект 'CString' мог восстановить свое внутреннее состояние. – IInspectable

ответ

1

Ни один из них не является правильным. Первый, похоже, работает по совпадению, в то время как последний использует инструмент, который выполняет другую цель. Единственный правильный путь, чтобы вызвать оператор приведения:

buffer.Format("%s", static_cast<LPCTSTR>(value)); 

пропускание CString объекта непосредственно работает совпадения только с указателем размером значения в начале объекта интерпретируются как указатель на массив символов , Первым членом класса класса CString является член m_pszData - указатель, в котором хранится управляемая последовательность символов.

GetBuffer следует использовать только в том случае, если вам необходимо напрямую манипулировать содержимым CString. Обратите внимание, что это возвращает указатель не const. Это часто используется при взаимодействии с API-интерфейсом C (см. Modifying CString Contents Directly).