具有C函数的std :: string_view

时间:2019-05-07 20:54:12

标签: c++ string-view

我在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 ++禁止将字符串转换为char。 因此,为了摆脱这一点,我想到了用string_view创建一个c ++包装器,以避免不必要地处理我的字符串

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

现在,如果我正确理解了引用,string_view不一定包含一个终止的空字符,对于所有c函数来说都是必不可少的,因为它不拥有字符串对象。它只是显示它。

但是在我的特殊情况下,我可以假设string1和string2以null结尾吗?

2 个答案:

答案 0 :(得分:3)

  

但是在我的特殊情况下,我可以假设string1和string2以null结尾吗?

不。您不应该假定字符串视图以null结尾。如果C函数期望以null终止的字符串,则建议的包装函数起反作用。


  

使用的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

答案 1 :(得分:2)

std :: string已经具有提供指向旧C库函数的指针的功能

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

这些提供适合所有C函数的非所有权只读指针,这些C函数在函数调用期间需要只读访问。我假设std :: string的寿命比函数调用更长,并且该指针仅在函数调用期间使用。或正如我上面链接的文档所述,“返回的指针可能会因进一步调用修改该对象的其他成员函数而无效。” (显然包括析构函数)

此外,请注意在c ++ 98构建中使用c_str(),因为正如documentaion链接和eerorika所述,data()不能保证直到c ++ 11才终止终止null。

#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());
}