我们可以从 char 指针创建一个 C++ 字符串对象,其中对字符串对象的操作反映到源 char 指针吗?
Can we create a C++ string object from char pointer where the operations on the string object reflects to the source char pointer?
我一直在尝试使用 C++ 字符串 class 丰富的方法(find_first_of,替换)来处理任务的一些字符串。
我围绕上述代码创建了一个包装文件,它可以包含在 'C' 源文件中并获得功能。
strUtils.h
#ifdef __cplusplus
extern "C" {
#endif
void doTheStringWork(char *inStr, unsigned beginLoc);
#ifdef __cplusplus
}
#endif
strUtils.cpp
#include "strUtils.h"
/*some standard includes here*/
void doTheStringWork(char *inStr, unsigned beginLoc) {
std::string inStr_s(inStr);
/* Doing some processing with the string object inStr_s*/
/* .......*/
/* Done */
return;
}
现在我遇到了一个问题,据我所知,如果不制作副本就无法解决。所以,我在这方面寻求你的帮助。
问题是我需要将 doTheStringWork
函数完成的更改返回到调用者的位置。您可能会说从 func 中获取 .c_str()
值作为 return 或以某种方式获取副本。这种方法效果很好,但对于我的任务来说,它变得非常慢,因为字符串可能太长,我可能需要它递归处理。
简而言之:我们可以围绕一个 char 指针创建一个字符串对象吗?我可以在其中使用所有字符串函数,而 char 指针反映了所有这些变化。如果使用标准库无法实现这样的事情,有人可以提供一种方法,我怎样才能在这里实现我的目标。
最好的解决方案是放弃 C,使用 C++ 并摆脱混乱。但是因为你可能做不到,下一个最好的解决方案是创建你自己的 C 可见结构和一些 C 可见函数(本质上是 PIMPL),在 C++ 源代码中定义它们(这样你就可以获得 std::string
的好处)并使用他们来自C。像这样的东西。
在strUtils.h
header:
#ifdef __cplusplus
extern "C" {
#endif
typedef struct cpp_string cpp_string;
cpp_string *cpp_string_create(const char *txt, int size);
void cpp_string_free(cpp_string *);
cpp_string *cpp_string_add(cpp_string *, cpp_string *);
... // all operations you need
#ifdef __cplusplus
}
#endif
在 C++ 源代码中 (strUtils.cpp
):
#include <string>
struct cpp_string {
std::string str;
cpp_string(std::string str): str(std::move(str)) { }
};
extern "C" cpp_string *cpp_string_create(const char *txt, int size)
{
return new cpp_string{ std::string{ txt, (size_t)size } };
}
// fill operations here
// since this is C++ file, just use std::string without copying
现在,当你想使用它时,你可以这样做:
int main()
{
cpp_string *s = cpp_string_create("qwerty", 6);
// do something with s
// dont forget to free s
cpp_string_free(s);
return 0;
}
这通过创建自己的数据回避了整个 can-i-overwrite-someone-elses-memory(不,你不能,除非你想遇到奇怪的问题)。
我一直在尝试使用 C++ 字符串 class 丰富的方法(find_first_of,替换)来处理任务的一些字符串。
我围绕上述代码创建了一个包装文件,它可以包含在 'C' 源文件中并获得功能。
strUtils.h
#ifdef __cplusplus
extern "C" {
#endif
void doTheStringWork(char *inStr, unsigned beginLoc);
#ifdef __cplusplus
}
#endif
strUtils.cpp
#include "strUtils.h"
/*some standard includes here*/
void doTheStringWork(char *inStr, unsigned beginLoc) {
std::string inStr_s(inStr);
/* Doing some processing with the string object inStr_s*/
/* .......*/
/* Done */
return;
}
现在我遇到了一个问题,据我所知,如果不制作副本就无法解决。所以,我在这方面寻求你的帮助。
问题是我需要将 doTheStringWork
函数完成的更改返回到调用者的位置。您可能会说从 func 中获取 .c_str()
值作为 return 或以某种方式获取副本。这种方法效果很好,但对于我的任务来说,它变得非常慢,因为字符串可能太长,我可能需要它递归处理。
简而言之:我们可以围绕一个 char 指针创建一个字符串对象吗?我可以在其中使用所有字符串函数,而 char 指针反映了所有这些变化。如果使用标准库无法实现这样的事情,有人可以提供一种方法,我怎样才能在这里实现我的目标。
最好的解决方案是放弃 C,使用 C++ 并摆脱混乱。但是因为你可能做不到,下一个最好的解决方案是创建你自己的 C 可见结构和一些 C 可见函数(本质上是 PIMPL),在 C++ 源代码中定义它们(这样你就可以获得 std::string
的好处)并使用他们来自C。像这样的东西。
在strUtils.h
header:
#ifdef __cplusplus
extern "C" {
#endif
typedef struct cpp_string cpp_string;
cpp_string *cpp_string_create(const char *txt, int size);
void cpp_string_free(cpp_string *);
cpp_string *cpp_string_add(cpp_string *, cpp_string *);
... // all operations you need
#ifdef __cplusplus
}
#endif
在 C++ 源代码中 (strUtils.cpp
):
#include <string>
struct cpp_string {
std::string str;
cpp_string(std::string str): str(std::move(str)) { }
};
extern "C" cpp_string *cpp_string_create(const char *txt, int size)
{
return new cpp_string{ std::string{ txt, (size_t)size } };
}
// fill operations here
// since this is C++ file, just use std::string without copying
现在,当你想使用它时,你可以这样做:
int main()
{
cpp_string *s = cpp_string_create("qwerty", 6);
// do something with s
// dont forget to free s
cpp_string_free(s);
return 0;
}
这通过创建自己的数据回避了整个 can-i-overwrite-someone-elses-memory(不,你不能,除非你想遇到奇怪的问题)。