Файлы Mixing Objective C, (*. M, *.mm &.c/.cpp)

В моем проекте Основные библиотеки являются частью файлов C/С++, в то время как пользовательский интерфейс должен быть разработан в Objective C, Я могу получить доступ/вызвать функции С++ из файлов Objective C/.mm но не удастся пока удачи, то есть я не могу вызывать функции Objective 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

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

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

Some system header file
Some Core Class Header file 

#import <foundation/foundation.h>

Ответы

Ответ 1

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

Ответ 2

Я нашел невозможным использовать любой Objective-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.

Ответ 3

Если вы используете 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

Ответ 4

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