2009-09-25 5 views
2

Мне нужно вызвать функцию-член C++ из программы C.
Я создал файлы .cpp/.h обертки в C-коде, обернув функции-члены C++.Вызов функции класса C++ класса из C (Visual Studio)

wrapper.cpp

IE-
#include "wrapper.h" 

extern "C" { 

    void wrap_member1() 
    { 
    Class::member1(); 
    } 

    void wrap_member2() 
    { 
    Class::member2(); 
    } 
} 

и wrapper.h:

#include <windows.h> 
#include <stdio.h> 
#include "../C++ class with members I need to call.h" 


extern "C" void wrap_member1(); 
extern "C" void wrap_member2(); 

Моя проблема в том, когда я Скомпилируйте:
ошибка C2061: синтаксическая ошибка: 'Класс' идентификатор

Он указывает на объявление .h класса C++ как ошибку. Тот же результат, как если бы у меня не было файлов-оберток ....?

P.S. Я также удалил «Экстерн„C“» из прототипов и получил ошибку на функцию обертку:

error C2732: linkage specification contradicts earlier specification for 'wrap_member1' 

Любые советы?

+0

Кроме того: какие функции членов? статический или нестатический? Похоже, вы хотите вызвать статические функции-члены. – sellibitze

ответ

3

Есть два вопроса:

Один, вы в том числе заголовочный файл C++ в заголовочном файле C. Это означает, что компилятор C получает код C++. Это вызывает ошибку, с которой вы столкнулись. Как предлагает Reed Copsey, поместите #include в исходный файл C++ вместо файла заголовка C.

Два, вы используете extern "C" в файле заголовка C. Оберните ваше заявление в #ifdef как таковой:

#ifdef __cplusplus 
extern "C" { 
#endif 

/* Functions to export to C namespace */ 

#ifdef __cplusplus 
} 
#endif 

Это позволит файл, который будет использоваться как для C и C++.

2

Вы должны включить свой класс в wrapper.cpp:

#include "wrapper.h" 
#include "ClassHeaderFile.h" // The header that defines "Class" 

extern "C" { 

    void wrap_member1() 
    { 
    Class::member1(); 
    } 

    void wrap_member2() 
    { 
    Class::member2(); 
    } 
} 
+0

, похоже, ничего не меняет. Кроме того, зачем мне включать его здесь, если он включен в файл wrapper.h, который включен в файл wrapper.cpp? просто любопытно ... –

+0

Вы должны _remove_ его из wrapper.h и добавить его в wrapper.cpp. Имейте в виду, что wrapper.h не должен содержать кода C++, если вы хотите, чтобы его можно было использовать из C - и 'class' - это, очевидно, код на C++. –

3

В вашей обертке вы должны conditionaly скомпилировать extern "C" часть, потому что это C++ только построить:

wrapper.h:

#ifdef __cplusplus 
extern "C" { 
#endif 

extern void wrap_member1(); 

#ifdef __cplusplus 
} 
#endif 

В wrapper.cpp:

extern "C" void wrap_member1() 
{ 
    Class::Member1(); 
} 

В вашем модуле C вы включаете только wrapper.h и ссылку на wrapper.obj.

BTW Objective-C способен использовать C++, просто измените имя вашего файла с * .m на * .mm в XCode.

+1

Что общего у Obj-C? – jalf

+0

Исходное сообщение имеет тег Objective-C –

Смежные вопросы