2010-08-02 5 views
0

J'ai une application MFC dans laquelle j'ai déclaré un objet global dit "obj" dans un fichier appelé MiRec2PC.cpp maintenant je veux utiliser cet objet dans un fichier C.MFC: Comment utiliser l'objet global C++ dans C

J'ai utilisé une approche dans laquelle j'inclue le fichier d'en-tête dans lequel la structure de cet objet particulier est déclarée. J'utilise aussi un mot-clé "extern" avec cet obj quand je l'utilise. mais le compilateur montre une erreur de lien:

 
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) 

Cordialement

Umair

+0

pouvez-vous montrer votre code ?? – Badr

+0

Est-ce que C supporte même des objets? Les fichiers .obj sont-ils compatibles entre C et C++? Utilisez-vous le même compilateur pour les deux? N'est-il pas plus facile de simplement encapsuler l'objet C++ dans une DLL (COM), puis d'appeler la DLL à partir de votre application C? Je pense que vous essayez de rendre les choses plus complexes que nécessaire. –

+0

Merci pour la perspicacité. Je dois être un peu plus spécifique quand je dis en fait que je fais référence à une variable de structure. En ce qui concerne le compilateur, j'utilise VC++ 6.0. Et je ne veux pas utiliser COM. Et les choses sont complexes ici :). Je serais obligé si vous venez avec des approches comme une variable C qui peut être accessible à partir de C++ ou une variable C++ qui peut être accessible à partir de C. Espérons avoir de vos nouvelles bientôt. Cordialement Umair – Omayr

Répondre

1

Vous ne pouvez pas accéder aux classes de C++ dans C sans une sorte de indirection et/ou de l'interface. Si vous voulez vraiment l'utiliser en C (Pourquoi?), Vous devrez concevoir une sorte d'interface externe "C" pour votre objet.

E.g. mettre en œuvre certaines 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 

Et puis à cinterface.cpp implémenter l'interface de langage C déléguer à des fonctions membres de l'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(); 
} 

Et enfin, utiliser l'interface C dans votre source. c:

#include <cinterface.h> 

int main() 
{ 
    ObjCType o = obj_get_obj(); 
    int x = obj_get_value (o); 
} 
+0

Notez que vous n'avez pas besoin de répéter la spécification de liaison pour les définitions de fonction. –

+0

@Georg: Ok, édité. – wilx

+0

Pourriez-vous me dire l'inverse comment utiliser la variable C++ pas les objets dans les fichiers C sans utiliser les fichiers d'en-tête! – Omayr