pep*_*ero 2 c++ struct type-conversion
我有两个库,分别来自C++和C:
用C++编写的lib:
typedef struct {
char val[4096];
} AString;
Run Code Online (Sandbox Code Playgroud)
C中的lib B:
typedef struct STRING_TYPE{
unsigned char *u1_list;
signed int i4_length;
} BString;
Run Code Online (Sandbox Code Playgroud)
如果我无法触摸lib A&B代码,即无法在AString类中添加强制转换运算符.如何转换AString至BString?
编辑1:没有定义单独的功能:
AString as=XXX; // given variable 'as' to convert,
unsigned char p[4096];
size_t const N = std::min(strlen(as.val), 4096);
BString bs = { p, N };
std::copy( static_cast<unsigned char*>(&as.val[0]), static_cast<unsigned char*>(&as.val[N]), bs.u1_list );
// or use memcpy like:
memcpy (bs.u1_list, as.val, N+1);
// then follows the part to use converted variable bs;
func(bs);
Run Code Online (Sandbox Code Playgroud)
但代码不是模块结构化的.
要不然:
编辑2:本质上是EDIT_1,定义一个函数,
void convert (AString& as, BString& bs)
{
size_t const N = std::min(strlen(as.val), 4096);
std::copy( static_cast<unsigned char*>(&as.val[0]), static_cast<unsigned char*>(&as.val[N]), bs.u1_list );
// or use memcpy like:
memcpy (bs.u1_list, as.val, N+1);
bs.i4_length = N;
}
Run Code Online (Sandbox Code Playgroud)
但在调用此函数之前,用户必须定义一个数组,如
AString as=XXX; // given variable 'as' to convert,
unsigned char p[4096];
BString bs;
bs.u1_list = p;
convert(as, bs);
// then follows the part to use converted variable bs;
func(bs);
Run Code Online (Sandbox Code Playgroud)
两者都很尴尬.
是不是有任何独立的,单独的功能方式来做到这一点?
像这样的东西:
BString convert(AString const& as)
{
size_t const N = std::min(strlen(as.val), 4096);
BString bs = { new unsigned char[N], N };
std::copy(
static_cast<unsigned char*>(&as.val[0]),
static_cast<unsigned char*>(&as.val[N]),
bs.u1_list
);
return bs;
}
Run Code Online (Sandbox Code Playgroud)
请务必记录此内存现在可能泄露的事实.老实说,这两种类型在C++中似乎都是奇怪的东西.怎么了std::string
?
归档时间: |
|
查看次数: |
488 次 |
最近记录: |