Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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++;(CbundleGetMainBundle) 我正在编写一个iOS应用程序,它有一个C++组件。为了获得主捆绑包,许多其他答案建议使用以下方法: CFBundleRef mainBundle = CFBundleGetMainBundle();_C++_Ios_Objective C_Objective C++ - Fatal编程技术网

使用C++;(CbundleGetMainBundle) 我正在编写一个iOS应用程序,它有一个C++组件。为了获得主捆绑包,许多其他答案建议使用以下方法: CFBundleRef mainBundle = CFBundleGetMainBundle();

使用C++;(CbundleGetMainBundle) 我正在编写一个iOS应用程序,它有一个C++组件。为了获得主捆绑包,许多其他答案建议使用以下方法: CFBundleRef mainBundle = CFBundleGetMainBundle();,c++,ios,objective-c,objective-c++,C++,Ios,Objective C,Objective C++,这很好,但似乎我必须包括以下内容 #include <UIKit/UIKit.h> 我假设这与我的C++代码有关。我想知道是否还有其他我可以包含的东西不会抛出这个错误?如果不是,访问C++代码中文件路径的正确方法是什么? ,可以尝试只包括代码> Copeoundation < /Calp> < /P> #include <CoreFoundation/CoreFoundation.h> 点是——当您试图包含“< /代码>”时,它认为代码是本机C或C++。如果是这样,您

这很好,但似乎我必须包括以下内容

#include <UIKit/UIKit.h>

我假设这与我的C++代码有关。我想知道是否还有其他我可以包含的东西不会抛出这个错误?如果不是,访问C++代码中文件路径的正确方法是什么?

,可以尝试只包括代码> Copeoundation < /Calp> < /P>
#include <CoreFoundation/CoreFoundation.h>

点是——当您试图<代码>包含“< /代码>”时,它认为代码是本机C或C++。如果是这样,您需要通过

#ifndef…
告诉预处理器只包含一次

如果你计划将C++和目标C代码混合使用,使用<>代码>导入< /COD>而不是<代码>,包含< /COD>。你需要重命名所有文件,使用这个类从<代码> M< /代码>到<代码> .mm < /代码>扩展。


最后一个。我确信,
NSString
是必须导入的
NSFoundation
CoreFoundation
的一部分-
UIKit
不负责
NSObject
对象。

这是由于C的“编译单元”概念。基本上,源文件中包含的所有头文件都必须使用该文件的语言编写。由于目标C和C++都是(大致)C的超集,所以C++和Obje- C源文件中可以包括C标题(如CopeFoundation)。 <>但是,C++编译器不知道如何读取Objto-C文件,Objy-C编译器不知道如何读取C++文件,所以如果你从C++文件中包含像UIKit这样的Objy-C头,C++编译器会给你很多错误信息。 为了避免这个问题,您应该查阅Cbundle的文档。事实证明,CFBundle是CopeFoundation的一部分,它是一个C API,因此可以很容易地从C++文件中调用,您只需要包括正确的头。 虽然包含UIKit也可能有效,但这只是UIKit的某些部分基于CoreFoundation并使用它,因此包含CoreFoundation这一事实的副作用

但是,并非所有API都是C版本。如果您想从UIKit或AVFoundation等调用某些东西,您可能需要创建一个C“包装函数”来完成您想做的事情,并且在内部是在Objective C中实现的。只要您确保只有
.m
实现文件包含Objective-C,头文件只公开了函数和标准的C数据类型,如int或BoL,然后可以像C++一样调用C++应用程序的函数(这很可能需要使用<代码>外写“C”<代码>,就像它将用C一样)。

还有一个叫做“Objul-C++”(文件后缀<代码> .Mm>/Cuff>),它是一个“伪语言”,它允许你在一个实现文件中混合ObjuleC和C++,但是即使这样,你也必须注意不要在你的头中公开任何Objy-C,以便能够从一个普通C++文件调用它。 CFBunLeReFE>代码>不是C++中的完全类型,我是这样做的:

#包括
std::string get_resources_dir()
{
CFURLRef resourceURL=CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
char resourcePath[PATH_MAX];
if(CFURLGetFileSystemRepresentation)(resourceURL,true,
(UInt8*)资源路径,
路径(最大值)
{
if(resourceURL!=NULL)
{
CFRelease(resourceURL);
}
返回资源路径;
}
}
#包含
就足够了。请注意,如果您需要C语言(而不是++),请单击此处进行精彩讨论,谢谢<代码>#包括为我工作
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFBundle.h>