C调用C++代码总结

由于项目需要在多核芯片上跑,所以需要把C代码转成C++代码。我用的SDK是XLINX的petalinux来转换。

总结,就是对C++的类再进行一次封装,比如我现在有一个Person的类,起名为person.cpp,person.h代码如下:

//----person.cpp-----
#include 

#include "person.h"


Person::Person(std::string name, int age)

    : name_(name), age_(age) {}
/*
 * person.h
 *
 *  Created on: Jan 8, 2019
 *      Author: qq
 */

#ifndef PERSON_H_

#define PERSON_H_
#include 
class Person {

 public:
  Person(std::string name, int age);
  ~Person() {}
  const char *GetName() { return name_.c_str(); }
  int GetAge() { return age_; }
 private:
  std::string name_;
  int age_;
};

#endif // PERSON_H_

然后关键的步骤来了,需要再建一个C和C++转换封装的文件。我现在再创建一个wrapper.cpp,对person进行一次封装,其对应的.h和.cpp代码如下:

/*
 * wrapper.cpp
 *
 *  Created on: Jan 8, 2019
 *      Author: qq
 */

#include "person.h"
#include "wrapper.h"

void *call_Person_Create() {

  return new Person("Aland", 18);

}
void call_Person_Destroy(void *p) {

  delete static_cast(p);

}
int call_Person_GetAge(void *p) {

  return static_cast(p)->GetAge();

}

const char *call_Person_GetName(void *p) {

  return static_cast(p)->GetName();

}
/*
 * wrapper.h
 *
 *  Created on: Jan 8, 2019
 *      Author: qq
 */

#ifndef SRC_WRAPPER_H_
#define SRC_WRAPPER_H_
#ifndef WRAPPER_H_
#define WRAPPER_H_
#ifdef __cplusplus
extern "C"
{
#endif
void *call_Person_Create();
void call_Person_Destroy(void *);
int call_Person_GetAge(void *);
const char *call_Person_GetName(void *);
#ifdef __cplusplus
}
#endif
#endif // WRAPPER_H_
#endif /* SRC_WRAPPER_H_ */

然后在main.c里面包含wrapper.h就可以调用了C++的相关函数了,main文件如下:

/*
 * main.c
 *
 *  Created on: Jan 8, 2019
 *      Author: qq
 */
#include"wrapper.h"
#include"stdio.h"
	int jack() {
	  void *p = call_Person_Create();
	  int age = call_Person_GetAge(p);
	  const char *name = call_Person_GetName(p);
	  call_Person_Destroy(p); // 记得释放 p
	  printf("name=%s, age=%d\n", name, age);
	}

 

你可能感兴趣的:(C调用C++代码总结)