Смешивание файлов 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

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

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

Some system header file
Some Core Class Header file 

#import <foundation/foundation.h>

4 ответа

Решение

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

Я обнаружил, что невозможно использовать любой 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.

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

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

В XCode 11 это можно сделать, изменив параметр сборки Compile Source as (GCC_INPUT_FILETYPE) на Objective-C++ (sourcecode.cpp.objcpp). При этом нет необходимости изменять тип расширения файла на mm.

Другие вопросы по тегам