2011-01-17 18 views
14

Projemde Core kütüphaneleri C/C++ dosyalarının bir parçasıdır, UI ise Objective C'de geliştirilmelidir, erişmeye /, Objective C /, mm dosyaları C++ işlevleri çağrı ancak şu ana kadar hiçbir şans ters yani ben Objective C başlığını bile sistem başlığınıMixing Objective C, (* .m, * .mm & .c /.cpp) dosyaları

içerecek şekilde çalıştığında C++ dosyalar, gelen Objective C işlevleri çağırmak mümkün değilim 1000+ derleme hatası ulaşım
#import <foundation/foundation.h> 

, bu

gibi

şey

/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180: error: expected unqualified-id before '@' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182: error: expected initializer before '*' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'NSString' was not declared in this scope 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'aSelectorName' was not declared in this scope 

ben çok C++ kodu değiştirmeden, vb .. kimse beni aramaktan mümkün olan en iyi yolu/NSObject devralınan erişim nesnel C sınıfı önerebilir bazı ön derlemek bayrağını eksik, ben sadece gerekir

Kod yapısı/Sipariş siz de Objective-C kullanması gerekir C++ kodu ile bir .cpp varsa başlık dosyaları

Some system header file 
Some Core Class Header file 

#import <foundation/foundation.h> 
+2

olmalıdır

+0

@Bavarious: HFS + varsayılan olarak duyarsız durumdur çünkü muhtemelen olduğu gibi çalışacaktır rağmen. – JeremyP

+1

@JeremyP Yup, _should_ yerine _must_. =) Büyük/küçük harf duyarlı bir dosya sisteminde derlendiğinde kodu bozulur. –

cevap

44

olan dahil, ya bu .cpp dosyayı yeniden adlandırmak için bir fonksiyon çağrı .mm veya derleyiciye -x objective-c++ iletin.

+1

Bu parametreyi derleyiciye nasıl aktarabiliriz? bunu proje ayarlarında bulabilir miyiz? – AmineG

+0

@some Hangi Xcode sürümünü kullanıyorsunuz? –

+0

Özellikle Xcode 3.2.5 kullanıyorum – AmineG

4

C++ üstbilgi dosyalarında herhangi bir Objective-c kullanması imkansız buldum. Ancak, uygulama dosyalarına Objective-c'yi ekleyebilirsiniz.

(, mm veya dosyanın bilgi dosyaları .Cpp nasıl yorumlanacağı ayarlayabilirsiniz Bilgi-> Genel seçin:. FileType: Sourcecode.cpp.objcpp)

Kullanım

cppClass.h :

class objcClass; 

objcClass* mMemberVariable; 

cppClass.mm: cpp başlık dosyasına

#import "objcClass.h"; 

void cppFunction(){ 
    [objcClass message]; 
} 

.

Daha sonra, sınıfı .cpp veya .mm dosyasında tanımlayan başlığı ekleyin.

+0

Çalışmıyorken, – Amitg2k12

+0

Nesne C'yi bir C++ başlık dosyasında kullanabilirsiniz, bunu yapan bir proje üzerinde çalışıyorum. Uygulama, Yardımcı Programlar -> Dosya Denetçisi'nde Objective-C++ olarak ayarlanmıştır ve baş içindeki obj-c kodu #if olarak tanımlanmıştır (__OBJC__) –

+0

Başlık dosyasında herhangi bir Objective-C sınıfını bildiremezsiniz. bir .mm dosyası olmak üzere dosya. Benim kodumda kodumun çapraz platform olması gerektiğinden, herhangi bir Objective-C sınıfını başlıkta 'void *' 'olarak ilan ettim ve daha sonra bunları .mm uygulama dosyasında yayınladım. – Adamski

1

Qt kullanırsanız, bir Objective-C sınıfı bildirmek için kullanılabilecek Q_FORWARD_DECLARE_OBJC_CLASS makrosu vardır.

#ifndef Q_FORWARD_DECLARE_OBJC_CLASS 
# ifdef __OBJC__ 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname 
# else 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) typedef struct objc_object classname 
# endif 
#endif 
0

Ben bir programlama diline bağlı dosyaları genişletmek adının bir teknik kullandı: Bir referans olarak

, burada uygulamasıdır. Ayrıca, derleyiciye "-x object-C++" ekledim, ancak sorun devam etti. link için belediyeden yardım aldım, "dosya türü" parametresine dikkat et.