【发布时间】:2019-05-07 20:54:11
【问题描述】:
我在 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 创建一个 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 是空终止的吗?
【问题讨论】:
-
你是先尝试 std::string::data() 还是 std::string::c_str() ?
-
这一行(单独)无法编译:
void Add_To_log(const * const char pString_1, const * const char pString_2, int number);请阅读如何发布minimal reproducible example -
我认为创建一个看起来像一件事但有隐藏要求的界面是危险的。
-
你在编造一些东西。假设
Add_To_log的声明正确,您为foo()提供的代码不会触发任何警告。绝对没有像“ISO C++ 禁止将字符串转换为字符”这样的东西。你为什么还要谈论string_view?除了缺少返回类型之外,您的foo()非常好,并且可以在没有任何诊断消息的情况下进行编译。你的问题是什么? -
大概他们正在将 std::string 传递给一个采用 const char* 的函数,并且不知道 std::string 具有使这变得容易的函数。 (而且 C 函数原型显然也是错误的)
标签: c++ string-view