Теория
Вы можете получить доступ только к функциям, написанным на C из мира C. Каждый раз при вызове кода C ++ из C вы должны go через функцию-оболочку, в вашем случае smc_*
functions.
Теперь обратите внимание, что объявление функций-оболочки, который находится в файле заголовка оболочки smc.h
, не обязательно включать getinfo.hpp
. Это ключевая идея . Заголовок оболочки просто сообщает любой программе C, которая ее включает, тип аргументов и возвращаемые значения функций smc_*
. Заголовок должен соответствовать C.
Например, см. Изображение ниже. Функции foo
и bar
объявлены в файле wrapper.h
, который только включает другие заголовки C. Файл wrapper.cpp
, который фактически реализует оболочку и использует другие материалы из мира C ++ (например, STL или другие классы), включает заголовки C ++, которые ему нужны.
В вашем случае smc.cpp
будет включать getinfo.hpp
, а не smc.h
.
введите описание изображения здесь
Однако определения этих функций-оболочек должны знать типы функций C ++, которые они обертывают. Следовательно, smc.cpp
будет включать getinfo.h
. Кроме того, поскольку этот файл будет скомпилирован компилятором C ++, он будет понимать любые ссылки на C ++ STL во включенных заголовках.
EDIT: Пример кода
Предположим, я хочу обернуть class cppworld
.
cppworld.hpp :
class cppworld {
public:
cppworld();
int one();
};
cppworld. cpp:
#include <iostream>
#include "cppworld.hpp"
cppworld::cppworld() {}
int cppworld::one() {
return 1;
}
Я пишу оболочка с wrapper.h
и wrapper.cpp
.
wrapper.h :
#ifdef __cplusplus
extern "C"
{
#endif
int get_one();
#ifdef __cplusplus
}
#endif
wrapper. cpp:
#include "wrapper.h"
#include "cppworld.hpp"
int get_one() {
cppworld obj = cppworld();
return obj.one();
}
Я могу скомпилировать wrapper.cpp
и cppworld.cpp
в общую библиотеку. Затем, чтобы использовать библиотеку из C, я создаю программу C ниже.
cworld. c
#include <stdio.h>
#include "wrapper.h"
int main() {
printf("Calling one() returns: %d\n", get_one());
}