Во-первых, константная ссылка или значение ничего не меняет.
Затем вы должны рассмотреть, что ожидает функция. Есть разные вещи, которые функция может делать с char*
или char const*
--- например, исходные версии memcpy
использовали эти типы, и возможно, что такой код все еще существует. Будем надеяться, что это редкость, и в дальнейшем я буду предполагать, что char*
в функции C относятся к '\0'
завершающим строкам.
Если функция C принимает char const*
, вы можете передать ей результаты std::string::c_str()
; если это занимает char*
, это зависит. Если он принимает char*
просто потому, что он датируется до const
днями C, и фактически ничего не изменяет, std::string::c_str()
, за которым следует const_cast
, является подходящим. Однако, если функция C использует char*
в качестве выходного параметра, все становится сложнее. Я лично предпочитаю объявлять буфер char[]
, передавать его, а затем преобразовывать результаты в std::string
, но все известные реализации std::string
используют непрерывный буфер, и следующая версия стандарта потребует его, поэтому сначала правильно определите размер std::string
(используя std::string::resize()
, затем можно использовать передачу &s[0]
и последующее изменение размера строки до полученной длины (определяемой с помощью strlen(s.c_str())
, если необходимо).
Наконец (но это также проблема для программ C, использующих char[]
), вы должны учитывать любые проблемы жизненного цикла. Большинство функций, принимающих char*
или char const*
, просто используют указатель и забывают о нем, но если функция где-то сохраняет указатель для последующего использования, строковый объект должен существовать как минимум столько же времени, и его размер не должен изменяться в течение этого периода. (Опять же, в таких случаях я предпочитаю использовать char[]
.)
person
James Kanze
schedule
12.04.2011