将cpp类(.cpp文件)转换为c结构(.c文件)

时间:2016-12-06 10:21:31

标签: c++ c

我有一个名为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[];
    /* [...] */
};

3 个答案:

答案 0 :(得分:3)

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

struct Coverage{
    char country[256];
    --------
    };

char* RtimeDir(Coverage* c);

但是在这种情况下,可以使用任何指针进行调用,这将导致运行时错误。

答案 1 :(得分:2)

您应声明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的成员函数中。

答案 2 :(得分:2)

我也不确定你为什么要这样做,但你也可以通过功能指针(但更喜欢条件编译),在用C语言实现所有C ++之后做到这一点。 在下面的代码中,我试图通过使用函数指针将函数添加到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("%s\n",SStr.get(&SStr));

  Next_str.init = Init;
  Next_str.init(&Next_str);

  Next_str.set(&Next_str,"Next_Example");
  printf("%s\n",Next_str.get(&SStr));

  return 0;
}