2012-03-28 14 views
1

Ich nahm dies von einer Antwort auf eine Frage auf, wie man objective-c-Methode von C++ - MethodeAufruf der Objective-C-Methode von der C++ - Funktion?

aufrufen Dies läuft gut.

MyObject-C-Interface.h

#ifndef __MYOBJECT_C_INTERFACE_H__ 
#define __MYOBJECT_C_INTERFACE_H__ 1 

int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter); 

#endif 

MyObject.h

#import "MyObject-C-Interface.h" 

@interface MyObject : NSObject 
{ 
    int someVar; 
} 

- (int) doSomethingWith:(void *) aParameter; 
@end 

MyObject.mm

#import "MyObject.h" 

@implementation MyObject 

int MyObjectDoSomethingWith (void *self, void *aParameter) 
{ 
    return [(id) self doSomethingWith:aParameter]; 
} 

- (int) doSomethingWith:(void *) aParameter 
{ 
    // ... some code 
    return 1; 
} 

@end 

MyCPPClass.cpp

#include "MyCPPClass.h" 
#include "MyObject-C-Interface.h" 

int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter) 
{ 
    return MyObjectDoSomethingWith (objectiveCObject, aParameter); 
} 

JETZT Wenn ich so etwas wie

MyObject-C-Interface.h

#ifndef __MYOBJECT_C_INTERFACE_H__ 
#define __MYOBJECT_C_INTERFACE_H__ 1 

@class MyObject; 

int MyObjectDoSomethingWith (MyObject* myObjectInstance, void *parameter); 

#endif 

Meine Frage ist stattdessen der Verwendung void * myObjectInstance, wenn ich MyObject * myObjectInstance verwende.

es diesen Fehler
Fehler gibt: erwartet unqualifizierte-ID [1]: @class Linie und
Fehler: Verwendung von nicht deklarierter Bezeichner 'MyObject' [3] in Linie Funktionsprototyp

Hilfe!!!!

+0

überprüfen Sie bitte diese [link] (http://www.cocos2d-iphone.org/forum/. topic/14340) – StackFlowed

+0

Verschieben Sie einfach MyObjectDoSomethingWith aus der MyObject @ Implementierung. –

Antwort

3

Link-Fehler:

Der Verbindungsfehler ist mit der Art und Weise C++ Mangeln Funktionsnamen zu tun, die C nicht tut. Das hat eigentlich nichts mit Objective-C zu tun. Insbesondere

int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter); 

in C oder Objective-C (OSX) mit der Linker den Namen exportiert Verwendung _MyObjectDoSomethingWith. Eine Funktion mit demselben Namen und demselben Prototyp, die mit einem C++ - oder Objective-C++ - Compiler kompiliert wurde, ist dem Linker als __Z23MyObjectDoSomethingWithPvS_ bekannt. Dies wird "name mangling" genannt und kodiert die Parametertypen. Andernfalls würde das Überladen von Funktionen nicht funktionieren, da Funktionen mit unterschiedlichen Parametertypen, aber demselben Namen nicht unterschieden werden können. Um eine in C definierte Funktion aus C++ aufzurufen, müssen Sie daher den Prototyp so markieren, dass C-Verknüpfung erwartet wird, und der Name dieser spezifischen Überladung der Funktion wird nicht beschädigt.

Sie müssen den C++ Compiler sagen, es als eine C-Funktion zur Behandlung von extern "C", entweder wie folgt aus:

#ifndef MYOBJECT_C_INTERFACE_H 
#define MYOBJECT_C_INTERFACE_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter); 

#ifdef __cplusplus 
} 
#endif 

#endif 

oder so:

#ifndef MYOBJECT_C_INTERFACE_H 
#define MYOBJECT_C_INTERFACE_H 

#ifdef __cplusplus 
#define CFUN extern "C" 
#else 
#define CFUN 
#endif 

CFUN int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter); 

#endif 

@class Erklärung der Kompilierung Fehler (Bitte fragen Sie nicht mehr als eine Frage auf einmal):

Sie versuchen, #include "MyObject-C-Interface.h", die eine Objective-C @class Forward-Deklaration enthält, von MyCPPClass.cpp, die als reines C++ kompiliert werden wird. Objective-C-Direktiven sind hauptsächlich Syntaxfehler in C++, also können Sie das nicht tun. Um Objective-C-Objekte in reinem C++ oder C zu übergeben, müssen Sie den Typ id verwenden. Sie müssen dazu #include <objc/objc.h>, da id nicht standardmäßig in C oder C++ definiert ist.

* bitte auch das Präfix nicht Ihre Namen mit zwei Unterstrichen: __ - solche Namen sind reserviert *

+0

danke dafür, aber anstelle von id und void * kann ich den Namen der objektiven C-Schnittstelle verwenden, um das gleiche Objekt zu erhalten – tusharfloyd

+1

Nicht außerhalb von Objective-C und Objective-C++. – pmdj

+0

aber .h kommt nicht außerhalb von .m oder .mm, wenn ich es in MyObject * mit #import "MyObject.h" dann Linker Fehler kommt sonst mit void * oder ID-Programm-Builds und läuft gut. – tusharfloyd

Verwandte Themen