从c ++到c的数组结构的类型转换

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)

两者都很尴尬.

是不是有任何独立的,单独的功能方式来做到这一点?

Lig*_*ica 7

像这样的东西:

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

  • strlen在这里不安全,使用strnlen(你知道最大值是4096) (4认同)