混合Objective C,(*。m,*。mm& .c /.cpp)文件

时间:2011-01-17 15:15:18

标签: c++ objective-c cocoa objective-c++

在我的项目中,核心库是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>

5 个答案:

答案 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。