Я пытаюсь получить доступ к классу С++ и вызывать его метод из файла .c
.
Я google эту тему и найти это http://developers.sun.com/solaris/articles/mixing.html
В нем говорится:
Вы можете написать
extern "C"
функции в С++, которые будут обращаться к классамM
и вызвать их из C-кода.
Вот функция С++, предназначенная для вызова функции-члена foo
:
extern "C" int call_M_foo(M* m, int i) { return m->foo(i); }
Мой вопрос в том, где я могу разместить строку about? В моем файле С++ .h
? Или C .h
файл?
И это продолжается и говорит:
Вот пример кода C, который использует класс M
:
struct M; // you can supply only an incomplete declaration
int call_M_foo(struct M*, int); // declare the wrapper function
int f(struct M* p, int j) // now you can call M::foo
{
return call_M_foo(p, j);
}
Но как/где я должен создать класс M
в моем C файле?
И где я могу поставить вышеприведенный код? C .h
файл? С++ .h
файл? Или C .c
файл?
Спасибо.
Спасибо за подробный ответ GMan.
Я следовал твоему предложению. Но я получаю ошибку компиляции в моем файле .c
.
main.c: 33:
./some_class.h:24: error: expected '=,', ';,' asm или ' атрибут до' token
./some_class.h:25: error: expected ') перед' токеном
./some_class.h:26: error: expected ') перед' * токеном
И вот моя строка some_class.h
24-26
:
#ifdef __cplusplus
class M {
public:
M();
virtual ~M();
void method1(char* name, char* msg);
};
extern "C" {
#else
struct M;
#endif
/* access functions line 24-26 are here*/
M* M_new(void);
void M_delete(M*);
void M_method1(M*, char*, char*);
#ifdef __cplusplus
}
#endif
По какой-то причине мой компилятор C не любит extern "C"
в GMan оригинале some_test.h
. Поэтому я должен изменить это выше. Похоже, компилятор C не любит/понимает строку struct M;
.
Любая идея будет высоко оценена.