Ответ 1
Если у вас есть .cpp файл с кодом С++, который также должен использовать Objective-C, переименуйте этот файл .cpp в .mm или передайте -x objective-c++
компилятору.
В моем проекте Основные библиотеки являются частью файлов 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>
Если у вас есть .cpp файл с кодом С++, который также должен использовать Objective-C, переименуйте этот файл .cpp в .mm или передайте -x objective-c++
компилятору.
Я нашел невозможным использовать любой 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.
Если вы используете 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 objective-c ++" в компилятор, но проблема осталась. Мне помог совет для ссылки , обратите внимание на параметр" тип файла".