std :: string_view с C Fuction - PullRequest
0 голосов
/ 07 мая 2019

Я использую код Leagacy C в проекте C ++.

На используемой функции C выглядит так

void Add_To_log(const * const char pString_1, const * const char pString_2, int number);

Теперь, когда я вызываю эту функцию из кода C ++, вот так

foo()
{
     Add_To_log("my first string", "my second string", 2);
}

Я получаю предупреждение компилятора ISO C ++ Запрещает преобразование строки в символ.Таким образом, чтобы избавиться от этого, я подумал о создании оболочки с ++ с string_view, чтобы избежать ненужного копирования моих строк

void CPP_Wrapper(const string_view& string1, const string_view& string2, int number)
{
    Add_To_log(string1, string2, 2);
}

Теперь, если я правильно понял ссылку, string_view не обязательно содержит завершающий нулевой символ с, это важнодля всех функций c, потому что он не владеет строковым объектом.Он просто отображает его.

Однако могу ли я предположить, что в моем конкретном случае string1 и string2 завершены нулем?

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Однако могу ли я предположить в моем конкретном случае, что string1 и string2 завершены нулем?

Нет. Вы не должны предполагать, что строковое представление завершено нулем. Предложенная вами функция-обертка является контрпродуктивной, если функция C ожидает строку с нулевым символом в конце.


На использованной функции C выглядит так

void Add_To_log(const * const char pString_1, const * const char pString_2, int number);

Эта декларация неверна. Если вы исправите это так:

void Add_To_log(const char * const  pString_1, const char * const pString_2, int number)

тогда этот вызов правильно сформирован:

Add_To_log("my first string", "my second string", 2); // No problem
3 голосов
/ 08 мая 2019

std :: string уже имеет функции для предоставления указателя на старые функции библиотеки C

http://www.cplusplus.com/reference/string/string/data/

Они предоставляют не владеющий, доступный только для чтения указатель, подходящий для большинства функций библиотеки C, которым требуется доступ только для чтения во время вызова функции. Я предполагаю, что std :: string имеет большее время жизни, чем вызов функции, и что указатель используется только во время вызова функции. Или, как указано в документации, которую я связал выше, «возвращенный указатель может быть признан недействительным при последующих вызовах других функций-членов, которые изменяют объект» (очевидно, включая деструктор)

Кроме того, позаботьтесь об использовании c_str () в сборках c ++ 98, поскольку data () не гарантирует завершение нуля до c ++ 11, как отмечено в ссылке на документацию и eerorika.

#include <stdio.h>
#include <string>

extern "C" {
    void legacy_logger(const char * const pstr) {
        printf("%s\n", pstr);
    }
}

int main()
{
    std::string message{ "This is the string." };
    legacy_logger(message.data());
}
...