Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混合目标C、(*.m、*.mm和.C/.cpp)文件_C++_Objective C_Cocoa_Objective C++ - Fatal编程技术网

C++ 混合目标C、(*.m、*.mm和.C/.cpp)文件

C++ 混合目标C、(*.m、*.mm和.C/.cpp)文件,c++,objective-c,cocoa,objective-c++,C++,Objective C,Cocoa,Objective C++,在我的项目中,核心库是C/C++文件的一部分,而UI需要在Objective C中开发, 我能够从目标C/.MM文件访问/调用C++函数 但到目前为止,没有倒霉,也就是说,我不能从C++文件中调用目标C函数, 当我试图包括目标C标题甚至系统标题时 #import <foundation/foundation.h> 我是否缺少一些预编译标志等。。 谁能建议我,调用NSObject继承的目标C类的最好方法,而不需要修改很多C++代码,只需要调用一个函数< /p> 包含头文件的代码结构

在我的项目中,核心库是C/C++文件的一部分,而UI需要在Objective C中开发, 我能够从目标C/.MM文件访问/调用C++函数 但到目前为止,没有倒霉,也就是说,我不能从C++文件中调用目标C函数, 当我试图包括目标C标题甚至系统标题时

#import <foundation/foundation.h> 
我是否缺少一些预编译标志等。。 谁能建议我,调用NSObject继承的目标C类的最好方法,而不需要修改很多C++代码,只需要调用一个函数< /p> 包含头文件的代码结构/顺序如下

Some system header file
Some Core Class Header file 

#import <foundation/foundation.h>
某些系统头文件
一些核心类头文件
#进口

< p>如果你有一个C++代码,也需要使用Objto-C,或者将.CPP文件重命名为.mm或通过<代码> -X ObjuleC++<代码>编译器。

< P>我发现在C++头文件中使用任何Objy-C都是不可接受的。

但是,您可以在实现文件中包含Objective-c

(.mm或您可以在文件信息中设置如何解释.cpp文件。选择信息->常规:文件类型:Sourcecode.cpp.objcpp)

使用

第h类:

class objcClass;

objcClass* mMemberVariable;
cppClass.mm:

#import "objcClass.h";

void cppFunction(){
    [objcClass message];
}
在cpp头文件中


然后在.cpp或.mm文件中包含定义类的头。

如果使用Qt,则有
Q\u FORWARD\u DECLARE\u OBJC\u 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++”,但问题仍然存在。我得到了委员会的帮助,注意“文件类型”参数。

在XCode 11中,可以通过将构建设置编译源代码(GCC_INPUT_FILETYPE)更改为Objective-C++(sourcecode.cpp.objcpp)来完成。这样,就不需要将文件扩展名类型更改为mm。

应该是@bavariable:尽管它可能会按原样工作,因为默认情况下HFS+不区分大小写。@JeremyP-Yup,因此应该而不是must。=)他的代码在区分大小写的文件系统中编译时会中断。我们如何将此参数传递给编译器?我们可以在项目设置中找到它吗?@在这种情况下,右键单击项目树上的文件,选择“获取信息”,然后在“文件类型”中选择“sourcecode.cpp.objcpp”。这将告诉XCODE用<代码> -X ObjuleC++<代码>编译该文件。使用XCODE 4.6,我在项目级别上为我的项目的Buffice设置标签中的“Apple LLVM编译器4.2语言”下的“其他C++标志”和“其他C标志”设置了“代码> -X ObjuleC++”/“代码”。我正在做一个这样的项目。在Utilities->File Inspector中,实现被设置为Objective-C++,头部中的obj-C代码被包装在#if defined(OBJC)中。我发现,如果头文件中没有包含.mm文件的文件,则无法在头文件中声明任何Objective-C类。在我的例子中,因为我的代码需要跨平台,所以我在标题中将任何Objective-C类声明为
void*
,然后将它们转换为.mm实现文件。
#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