.Mm uzantısı olmadan c ++ işlevlerini objektif-c kodundan çağırmanın bir yolu var mı?

.Mm uzantısı olmadan c ++ işlevlerini objektif-c kodundan çağırmanın bir yolu var mı? Örneğin, bir C sarıcı veya bu durumda yardımcı olabilecek başka bir şey oluşturmak mümkün olabilir mi? .M dosyaları için "object-c ++ source" tipinin atanmasının mümkün olduğunu biliyorum, ancak istediğim gibi değil.

2
Dosyalarınızı yapmanın nesi var? Bu basit, standart bir yöntem
katma yazar James Webster, kaynak
Biraz daha bilgi verebilir misiniz? Belirli senaryoların size yardımcı olacağını bilmenin bir yolu var.
katma yazar mkb, kaynak

2 cevap

Evet, bunu sık sık yapıyorum. Çok az miktarda .mm tutkal koduna ihtiyacınız olacaktır, ancak sarmalayıcı kullanma konusundaki sezginiz doğrudur. Wrapping C ++ - Take 2 ile ilgilenebilirsiniz.

.Mm dosyalarının aşırı kullanımını önlemek için iyi nedenler vardır. Daha yavaş çalışırlar, yavaşlarlar (özellikle de önemli bir yüke maruz kaldıkları ARC altında), deneyimlerimde gdb'yi karıştırırlar ve ObjC ve C ++ sınıflarının karıştırılması oldukça kafa karıştırıcı ve hataya eğilimlidir. ObjC ve C ++'nizi aralarında ince bir katmanla bölmek iyi bir yaklaşımdır.

5
katma
"Daha yavaş koşar mısın?" C ++ nesnelerininobjective-c++'da derlendiğinde ARC'ye tabi olduğunu düşünmedim.
katma yazar IronMensan, kaynak

Objective-C ++ kullanmak gitmek için sabırsız bir yoldur, ancak eğer bir nedenden dolayı bunu kullanamazsanız * bir C sarıcısından geçebilirsiniz, fakat bu tamamen C olmalıdır. Yani böyle bir şeye benzeyecektir:

//MyClass.h

class MyClass {
public:
  MyClass() : myInt(10) {}
  ~MyClass() {}
  int GetMyInt() const {return myInt;}

private:
  int myInt;
}

//MyClassWrap.h

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {void * myClass} MyClassWrap;

MyClassWrap CreateMyClass();
void DestroyMyClass(MyClassWrap myClass);
int GetMyInt(MyClassWrap myClass);

#ifdef __cplusplus
}
#endif 

//MyClassWrap.cpp

#include "MyClassWrap.h"
#include "MyClass.h"

static void * implCreate()
{
  return static_cast(new MyClass());
}

static void implDestroy(void * myClass)
{
  delete static_cast(myClass);
}

static int implGetMyInt(void * myClass)
{
  return static_cast(myClass)->GetMyInt();
}

extern "C" {

MyClassWrap CreateMyClass() {
  MyClassWrap wrap;
  wrap.myClass=implCreate();
  return wrap;
}

void DestroyMyClass(MyClassWrap myClass) {
 implDestroy(myClass.myClass);
}

int GetMyInt(MyClassWrap myClass) {
  return implGetMyInt(myClass.myClass);
}

}  //extern "C"

Ayrı impl * işlevlerine sahip olmak gerekli olmayabilir, bu gibi bir şey yaptığımdan beri bir süre geçti. Bu appoach ile birobjective-cdosyasına MyClassWrap.h ekleyebilir veobjective-c++ olarak derlenmiş hiçbir dosya olmadan dolaylı olarak C ++ işlevlerine erişebilirsiniz.

* Belki kodda sınıf olarak adlandırılan çok fazla değişken değişemez

1
katma