Создатели C ++ написали FAQ , который также дает некоторые рекомендации по , как смешивать C и C ++ . Они также рассматривают возможность использования объектов C ++ из C code .
Option 1 : если вы просто хотите, чтобы компилятор C имел возможность для анализа вашего заголовочного файла task.h, вы можете скрыть части C ++, которые я использовал #ifdef __cplusplus
:
#ifndef TASK_H
#define TASK_H
#ifdef __cplusplus
#include "MyCCPObject.h"
int foo1(int);
int foo2(int);
int fooObject(MyCCPObject myCppObject); // Function involves a Class "MyCCPObject" type
extern "C" {
#endif
int foo3(void); // Function called in a C file
#ifdef __cplusplus
}
#endif
#endif //TASK_H
Option 2 : если вы хотите сделать функцию fooObject
доступно из C, затем вы можете изменить MyCppObject.h, чтобы предоставить полную информацию о классе для C ++ и только минимальный typedef
для C. typedef
гарантирует, что C понимает только имя класса MyCCPObject
без записи class
или struct
перед ним.
#ifdef __cplusplus
class MyCCPObject
{
public:
MyCCPObject(uint32_t val);
private:
uint32_t value;
};
#else
typedef struct MyCCPObject MyCCPObject;
#endif
и task.h в
#ifndef TASK_H
#define TASK_H
#include "MyCCPObject.h"
int foo1(int);
int foo2(int);
#ifdef __cplusplus
extern "C" {
#endif
int fooObject(MyCCPObject *myCppObject); // Function involves a Class "MyCCPObject" type
int foo3(void); // Function called in a C file
#ifdef __cplusplus
}
#endif
#endif //TASK_H
Обратите внимание, что мне нужно было изменить подпись fooObject
, чтобы получить указатель на объект, так как код C не видит полный класс и не знает размер объекта.