Звоните CString::GetString()
.
Это задает неправильный вопрос по неправильным причинам. Просто чтобы убрать это с пути, вот ответ из документации :
Возвращаемое значение
PXSTR
указатель на (нулевой) символьный буфер объекта.
Это верно для обеих перегрузок, с явным аргументом длины и без него. При вызове перегрузки с использованием аргумента длины внутренний буфер может быть изменен в соответствии с повышенными требованиями к хранилищу перед возвратом указателя на этот буфер.
Начиная с этого комментария становится очевидным, что вопрос заключается в том, чтобы задавать неправильные вопросы. Чтобы понять почему, вам нужно понять, для чего предназначено семейство GetBuffer()
членов класса: временно отключить принудительное применение инвариантов CString
1 для модификация , до установления их снова путем вызова одного из ReleaseBuffer () членов. Основным вариантом использования этого является взаимодействие с кодом C (например, Windows API).
Важная информация:
GetBuffer()
следует вызывать только в том случае, если вы планируете напрямую изменить содержимое сохраненной последовательности символов.
- Каждый вызов
GetBuffer()
должен соответствовать вызову ReleaseBuffer()
перед использованием любого другого CString
члена класса 2 . В частности, обратите внимание, что operator PCXSTR()
и деструктор являются членами класса.
- Пока вы следуете этому протоколу, последовательность контролируемых символов всегда будет заканчиваться нулем.
Учитывая ваш фактический вариант использования (Log.Print("%s\n", myCstring.GetBuffer())
), ни один из предыдущих действительно не применим. Поскольку вы не планируете фактически изменять содержимое строки, вы должны получить доступ к неизменяемому интерфейсу CString
(например, GetString () или оператор PCXSTR () ). Для этого требуются правильные сигнатуры функций (TCHAR const*
против TCHAR*
). В противном случае, используйте const_cast
, если вы можете быть уверены, что вызываемый не изменит буфер.
В этом есть несколько преимуществ:
- Это семантически правильно. Если вам нужен только просмотр строки символов, вам не нужен указатель на изменяемый буфер.
- Лишних копий содержимого нет.
CString
реализует семантику копирования при записи. Запрос изменяемого буфера требует копирования содержимого для общих экземпляров, даже если вы собираетесь выбросить эту копию сразу после вычисления текущего выражения.
- Неизменяемый интерфейс не может выйти из строя. Никаких исключений не выдается при вызове
operator PXCSTR()
или GetString()
.
1 Соответствующие инварианты: 1
Управляемая последовательность символов всегда заканчивается нулем. 2
GetLength()
возвращает количество символов в контролируемой последовательности, исключая нулевой терминатор.
2 Строго необходимо вызывать одну из реализаций ReleaseBuffer()
, если содержимое было изменено. Это часто не сразу видно из исходного кода, поэтому всегда вызов ReleaseBuffer()
является безопасной опцией.