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