MFC: как использовать C ++ Global Object в C - PullRequest
0 голосов
/ 02 августа 2010

У меня есть приложение MFC, в котором я объявил глобальный объект «obj» в файле с именем MiRec2PC.cpp, и теперь я хочу использовать этот объект в файле C.

Я использовал подход, в котором я включаю заголовочный файл, в котором объявляется структура этого конкретного объекта. Я также использую ключевое слово "extern" с этим объектом, когда я его использую. но все равно компилятор показывает ошибку ссылки:

LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
httpApplication.obj : error LNK2001: unresolved external symbol _m_iRecordInst
Debug/MiRec2PC.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

MiRec2PC.exe - 2 error(s), 12 warning(s)  

Привет

Umair

1 Ответ

1 голос
/ 02 августа 2010

Вы не можете получить доступ к классам из C ++ в C без какого-либо косвенного обращения и / или интерфейса. Если вы действительно хотите использовать его в C (почему?), Вам придется придумать какой-то внешний интерфейс "C" для вашего объекта.

например. реализовать некоторый cinterface.h:

#ifdef __cplusplus
extern "C" {
#endif

// It does not have to be void* but at this point it is the easiest thing to use.
typedef void * ObjCType;
ObjCType obj_get_obj (void);
int obj_get_value(ObjCType);

#ifdef __cplusplus
};
#endif

А затем в cinterface.cpp реализовать интерфейс языка C, делегирующий функции-члены Obj .:

#include <obj.hpp>
#include <cinterface.h>

// This is defined somewhere else.
extern Obj obj;

ObjCType obj_get_obj ()
{
  return &obj;
}

int obj_get_value(ObjCType o)
{
  return static_cast<Obj*>(o)->get_value ();
}

И, наконец, используйте интерфейс C в вашем source.c:

#include <cinterface.h>

int main ()
{
  ObjCType o = obj_get_obj ();
  int x = obj_get_value (o);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...