std::string_view 使用 C 函数
std::string_view with C Fuction
我在 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 已经具有提供指向旧 C 库函数的指针的函数
http://www.cplusplus.com/reference/string/string/data/
这些提供了一个 non-owning 只读指针,适用于在函数调用期间需要只读访问的大多数 C 库函数。我假设 std::string 的生命周期比函数调用更长,并且指针仅在函数调用期间使用。或者正如我在上面 link 编辑的文档所述,"The pointer returned may be invalidated by further calls to other member functions that modify the object."(显然包括析构函数)
此外,请注意在 c++98 构建中使用 c_str(),因为 data() 在 c++11 之前不能保证终止 null,如文档中所述 link 和 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());
}
However can i assume in my particular case that string1 and string2 are null terminated?
没有。你不应该假设一个字符串视图是空终止的。如果 C 函数需要 null-terminated 字符串,则您建议的包装函数会适得其反。
On used C function looks like this
void Add_To_log(const * const char pString_1, const * const char pString_2, int number);
那个声明是ill-formed。如果您将其修复为:
void Add_To_log(const char * const pString_1, const char * const pString_2, int number)
那么这个调用是well-formed:
Add_To_log("my first string", "my second string", 2); // No problem
我在 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 已经具有提供指向旧 C 库函数的指针的函数
http://www.cplusplus.com/reference/string/string/data/
这些提供了一个 non-owning 只读指针,适用于在函数调用期间需要只读访问的大多数 C 库函数。我假设 std::string 的生命周期比函数调用更长,并且指针仅在函数调用期间使用。或者正如我在上面 link 编辑的文档所述,"The pointer returned may be invalidated by further calls to other member functions that modify the object."(显然包括析构函数)
此外,请注意在 c++98 构建中使用 c_str(),因为 data() 在 c++11 之前不能保证终止 null,如文档中所述 link 和 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());
}
However can i assume in my particular case that string1 and string2 are null terminated?
没有。你不应该假设一个字符串视图是空终止的。如果 C 函数需要 null-terminated 字符串,则您建议的包装函数会适得其反。
On used C function looks like this
void Add_To_log(const * const char pString_1, const * const char pString_2, int number);
那个声明是ill-formed。如果您将其修复为:
void Add_To_log(const char * const pString_1, const char * const pString_2, int number)
那么这个调用是well-formed:
Add_To_log("my first string", "my second string", 2); // No problem