在我的项目中,核心库是C / C ++文件的一部分,而UI需要在Objective C中开发, 我能够从Objective C / .mm文件访问/调用C ++函数 但到目前为止反向没有运气,即我无法从C ++文件中调用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
我错过了一些预编译标志等。 任何人都可以建议我,最好的方式来调用/访问从NSObject继承的目标C类,而不需要修改很多C ++代码,我只需要调用一个函数
代码结构/包含头文件的顺序是
Some system header file
Some Core Class Header file
#import <foundation/foundation.h>
答案 0 :(得分:47)
如果您的.cpp文件包含需要使用Objective-C的C ++代码,请将该.cpp文件重命名为.mm或将-x objective-c++
传递给编译器。
答案 1 :(得分:4)
我发现在C ++头文件中使用任何Objective-c都是不可能的。
但是,您可以在实现文件中包含Objective-c。
(。mm或者你可以设置如何解释文件信息中的.cpp文件。选择Info-&gt; General:FileType:Sourcecode.cpp.objcpp)
使用
cppClass.h:
class objcClass;
objcClass* mMemberVariable;
cppClass.mm:
#import "objcClass.h";
void cppFunction(){
[objcClass message];
}
在cpp头文件中。
然后包含在.cpp或.mm文件中定义类的标题。
答案 2 :(得分:1)
如果使用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
答案 3 :(得分:0)
我根据编程语言使用名称扩展文件的技术。另外,我添加了&#34; -x objective-c ++&#34;到编译器,但问题仍然存在。理事会为link提供了帮助,注意&#34;文件类型&#34;参数。
答案 4 :(得分:0)
在XCode 11中,可以通过将构建设置编译源为(GCC_INPUT_FILETYPE)更改为 Objective-C ++ (sourcecode.cpp.objcpp)来完成。这样,无需将文件扩展名类型更改为mm。