C++ 桥接C++;我的swift密码。在XCode中,哪些文件扩展名适用于哪种基于c的语言?

C++ 桥接C++;我的swift密码。在XCode中,哪些文件扩展名适用于哪种基于c的语言?,c++,ios,objective-c,swift,xcode,C++,Ios,Objective C,Swift,Xcode,作为一个快速的编码员,我对c端的明显碎片感到非常困惑。不知何故,有Objto-C、Objul-C++、C和C++,它们都有.h,.Hpp,.m,.cp等文件扩展名,但是我不能找到XXCODE中哪种扩展到哪种文件类型的伟大文档(虽然我对C++应该是肯定的.HPP和.CPP)。 这混乱导致了我在试图把C++类暴露到我的银行代码中时所做的事情的真实想法。让我解释一下我的策略 我有一个由我修改过的XCode自动生成的桥接文件 桥接头.h // // Use this file to import yo

作为一个快速的编码员,我对c端的明显碎片感到非常困惑。不知何故,有Objto-C、Objul-C++、C和C++,它们都有.h,.Hpp,.m,.cp等文件扩展名,但是我不能找到XXCODE中哪种扩展到哪种文件类型的伟大文档(虽然我对C++应该是肯定的.HPP和.CPP)。 <>这混乱导致了我在试图把C++类暴露到我的银行代码中时所做的事情的真实想法。让我解释一下我的策略

我有一个由我修改过的XCode自动生成的桥接文件

桥接头.h

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#include <stdio.h>
#include <stdlib.h>

int* main1() {
    int *num;

    num = (int *)malloc(1000 * sizeof(int));
    for (int i = 0; i < 10; i++) {
        num[i] = i;
    }
    num[10] = 10;
    free(num);
    return num;
}
这个代码我希望XCODE能像Objul-C++代码一样处理,这样我就可以安全地导入我的C++代码,我认为它会自动链接到它的相应的头,因为如果我试图从我的另一个文件中导入它,它会导致一个导入周期,导致很多问题。 然而,这些假设肯定是错误的,因为这段代码似乎根本没有被编译过。Swift未看到功能
main 2
未显示在Swift中

还有一个矩形.hpp

#ifndef rectangle_hpp
#define rectangle_hpp

#include <stdio.h>

int main3() {
    return 3;
}
class Rectangle {
    int main();
};

#endif /* fancy_hpp */
#include "rectangle.hpp"

int Rectangle::main() {
    std::cout << "Hello world!";
    return 99;
}

int main4() {
    return 99;
}
\ifndef矩形\u水电站
#定义矩形_水电站
#包括
int main3(){
返回3;
}
类矩形{
int main();
};
#endif/*fancy_水电站*/
我相信XCODE应该把它解释成C++代码。还有

矩形.cpp

#ifndef rectangle_hpp
#define rectangle_hpp

#include <stdio.h>

int main3() {
    return 3;
}
class Rectangle {
    int main();
};

#endif /* fancy_hpp */
#include "rectangle.hpp"

int Rectangle::main() {
    std::cout << "Hello world!";
    return 99;
}

int main4() {
    return 99;
}
#包括“rectangle.hpp”
int矩形::main(){

std::cout你不能在
swift
中直接使用
c/c++
代码,因为类型系统不同。
Objective c/c++
是混合的,这意味着它既能理解
c/c++
类型,也能理解
swift
类型。要使用矩形
c++
类,你可以将其包装在
Objective c/c++
class并导入
-bridgeing header.hpp
文件中的
目标c/c++
头,以将其公开给
Swift

默认情况下,Swift处理所有扩展名为的文件-

*.m - as objective c files
*.mm - as objective c++ files
*.hpp - as (objective) c/c++ header files
*.cpp - as c++ files
*.c - as c files

现在来看看你的例子,如果我理解正确,你想在 SWIFT<代码>中使用C++类(比如“代码>矩形< /代码>”。下面是解决方案的分层视图。

+----------------------------------+
|  Rectangle (c++)                 |
+----------------------------------+
|  RectangleWrapper (objc++)       |
+----------------------------------+
|  Bridging header                 |
+----------------------------------+
|  Swift                           |
+----------------------------------+
本地阶级 桥接头

将目标C++类通过简单地导入Objc++头文件到桥接头中。

// Bridging-Header.hpp
#import "RectangleWrapper.hpp"
敏捷的

现在只使用目标C++ ++代码>矩形包装器< /C>类作为任何其他Swift类。< /P>

// use-rectangle.swift
let rect = RectangleWrapper()
rect.draw()
代码
<> > > < > >代码> C++ > <代码> .<目标> C使用.>代码> h >代码> >代码> > m>代码> C++使用<代码> .m> <代码> >我混淆了因为<代码> .CPP < /C> >代码> XCode在我给它制作C++文件时给了我.这两个扩展是什么?对于.ObjultC++,Xcode将给出.c++的CPP,因为它与Objul-C++@ CyrTik注释不一致,MeN1和MeN3不解决这个问题。这就是你所指的吗?有人可以只回答XC支持的所有基于C语言的列表,以及它们的文件扩展应该是B的吗?其他标题和实现?感谢您的清晰解释!我开始对这一点进行思考。不幸的是,这不太有效,我不知道为什么。当我要求Xcode生成桥接标题时,它会创建一个带有
.h
标题的文件。如果我将其更改为
.hpp
则编辑目标->构建集tings->Swift Compiler-General->Objective-C桥接头,如果从
.h
更改为
.hpp
,则会导致此错误:
:0:error:PCH file'/Users/Me/Library/Developer/Xcode/derivedddata/clanges2 cxgdgrbxzvlivintiolq/Build/Intermediates.noindex/PrecompiledHeaders/clanges2-briging-Header-Swift\u2L50v7offTWE-clang_53GTILGSD4G9.pch'未找到:未找到模块文件:0:错误:clang导入器创建失败
我不确定编译器为什么会对此特别关注,但它确实如此。然后它会从那里走下坡路。我从我的桥接头
.h
文件导入
矩形包装器.hpp
,该文件导入了
矩形.h
文件如果我构建它,会导致C++中的错误,因为类需要是类(所以它不是编译为C++代码)另一个摩擦点是,当我请求XCODE创建C++代码时,它默认的标题是“代码> > HPP < /代码>,所以我将它重命名为<代码> .H/COD>特别是保持它没有帮助的方式。好的,在文件头文件中更改矩形*ReCt无效*ReCt。在实现文件中,在调用之前,将文件类型转换为矩形*。ng draw.让我知道如果仍然抛出错误,请永远修复,但现在有一个错误
架构arm64的未定义符号:“\u OBJC\u CLASS\u$\ u RectangleWrapper”,引用自游戏场景中的:OBJC CLASS ref。o ld:symbol未找到架构arm64 clang:error:linker命令失败,退出代码为1(使用-v查看调用)
// use-rectangle.swift
let rect = RectangleWrapper()
rect.draw()