将CPP类(.CPP文件)转换为C结构(.c File)

convert a cpp class(.cpp file) into a c structure (.c file)

本文关键字:CPP 结构 File 转换 文件      更新时间:2023-10-16

我有一个名为coverage的类。

此类用于其他标题文件中。我想将转换为C 结构。其他标题文件正在使用函数中的类对象。我想在外面更改类,我不必在其他标头文件中进行更改。

像该功能是

string ABC(Coverage* coverage);

我的结构应该作为行为班级工作;但是无法在结构中创建功能,因为它不建议在c。

中使用。
class Coverage
{
    std::string country;
    std::string KpRuntimeDir();
    std::string CRtimeDir();
    std::string RtimeDir();
};

将类转换为:

struct Coverage n{
    char country[];
    /* [...] */
};

我想到的唯一方法是将类重写为结构(仅变量成员),并在结构之外定义函数(而不是方法)。但是,如果您既有私有方法和公共方法,则有一些固定的构造函数,那么它似乎毫无意义,您将永远无法获得相同的安全性和功能。

struct Coverage{
    char country[256];
    --------
    };
char* RtimeDir(Coverage* c);

,但在这种情况下,可以用任何铸造的指针调用,这些指针会导致运行时错误。

您应该声明extern "C"结构并将Coverage的实例转换为一个:

extern "C" {
    struct CoverageAsACStruct
    {
        char country[SOME_DEFINED_CONSTANT_COUNTRY];
        char KpRuntimeDir[SOME_DEFINED_CONSTANT_RUNTDIR];
        char CRtimeDir[SOME_DEFINED_CONSTANT_CRTIMEDIR];
        char RtimeDir[SOME_DEFINED_CONSTANT_RTIMEDIR];
    };
}
class Coverage
{
    std::string country();
    std::string KpRuntimeDir();
    std::string CRtimeDir();
    std::string RtimeDir();
    void buildCStructure( struct CoverageAsACStruct* dst ) const;
};
void Coverage::buildCStructure( struct CoverageAsACStruct* dst ) const
{
    std::string cached_country = country();
    if (cached_country.size()+1 > sizeof(dst->country))
        // error?
    // same for other fields
    ::strcpy(dst->country, cached_country.c_str());
    // same for other fields
}

每当您需要将Coverage实例(我们称为cov)传递给C函数f()时,将其传递:

struct CoverageAsACStruct ccov;
cov.buildCStructure(&ccov);
f(&ccov);

您甚至可以将其嵌入Coverage的成员功能。

我也不确定您为什么要这样做,但是您也可以通过函数指针(但更喜欢有条件的汇编)来执行此操作,毕竟所有C 均已在C中实现。在以下代码中,我尝试这样做,通过使用函数指针将函数添加到C结构中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
class Someclass{
 string some_str;
public:
 string get();
 void set(string str);
};
*/
struct SomeStruct;
typedef char *(*Getter)(struct SomeStruct *);
typedef void (*Setter)(struct SomeStruct *, char *);
typedef void (*Initialize)(struct SomeStruct *);
typedef struct SomeStruct{
  char some_chr[1024];
  Getter get;
  Setter set;
  Initialize init;
}STR;
char * Get(STR *SStr){
  return SStr->some_chr;
}
void Set(STR *SStr, char *str){
  strncpy(SStr->some_chr,str,strlen(str)+1);
}
void Init(STR *STRstr){
  STRstr->get = Get;
  STRstr->set = Set;
}
int main(){
  STR SStr,Next_str;
  SStr.init = Init;
  SStr.init(&SStr);
  SStr.set(&SStr,"Example");
  printf("%sn",SStr.get(&SStr));
  Next_str.init = Init;
  Next_str.init(&Next_str);
  Next_str.set(&Next_str,"Next_Example");
  printf("%sn",Next_str.get(&SStr));
  return 0;
}