it-swarm.com.ru

Смешивание файлов Objective C, (*. M, * .mm & .c /.cpp)

В моем проекте библиотеки Core являются частью файлов C/C++, в то время как пользовательский интерфейс должен быть разработан в Objective C, я могу получить доступ к/вызвать функции C++ из файлов Objective C/.mm, но пока не повезло, то есть я не возможность вызывать функции Objective C из файлов C++, когда я пытался включить заголовок Objective C даже системный заголовок

#import <foundation/foundation.h> 

получить около 1000+ ошибок компиляции,

что-то вроде этого

/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

Не хватает ли какого-нибудь флага предварительной компиляции и т.д. Кто-нибудь может мне подсказать лучший способ вызова/доступа к классу Objective C, который унаследован от NSObject, без изменения большого количества кода C++, мне просто нужно вызвать одну функцию

Структура кода/порядок включения заголовочных файлов

Some system header file
Some Core Class Header file 

#import <foundation/foundation.h>
14
Amitg2k12

Если у вас есть файл .cpp с кодом C++, который также должен использовать Objective-C, переименуйте этот файл .cpp в .mm или передайте компилятору -x objective-c++.

46
user557219

Я обнаружил, что невозможно использовать любой Objective-c в заголовочных файлах C++.

Однако вы можете включить Objective-c в файлы реализации.

(.mm или вы можете установить, как интерпретировать .cpp файлы в информации о файле. Выберите Info-> General: FileType: Sourcecode.cpp.objcpp)

Использование

cppClass.h:

class objcClass;

objcClass* mMemberVariable;

cppClass.mm:

#import "objcClass.h";

void cppFunction(){
    [objcClass message];
}

в заголовочном файле cpp.

Затем включите заголовок, который определяет класс в файле .cpp или .mm.

4
Joris van Liempd iDeveloper

Если вы используете Qt, есть макрос Q_FORWARD_DECLARE_OBJC_CLASS, который можно использовать для прямого объявления класса Objective-C.

В качестве ссылки, вот реализация:

#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
1
user362515

Я использовал методику расширения имени файлов в зависимости от языка программирования. Кроме того, я добавил "-x target-c ++" в компилятор, но проблема осталась. Мне помог совет по ссылка , обратите внимание на параметр "тип файла".

0
alexmorhun