从Swift调用C++函数

11

我该如何从Swift文件中调用一个C++函数(不涉及类)?我尝试了以下代码:

someCFunction.c文件中:

void someCFunction() {
    printf("Inside the C function\n");
}

void aWrapper() {
    someCplusplusFunction();
}

someCpluplusfunction.cpp文件中:

void someCplusplusFunction() {
    printf("Inside the C++ function");
}

main.swift 中:

someCFunction();
aWrapper();

Bridging-Header.h文件中:

#import "someCFunction.h"
#import "someCplusplusFunction.h"

我发现这个回答很有启发性,但我仍然不能使它正常工作。 你能指导我正确的方向吗?

谢谢!

1个回答

14

页眉长什么样?

如果你想在C++中显式设置与C兼容的函数的链接类型,那么你需要告诉C++编译器:

// cHeader.h

extern "C" {
    void someCplusplusFunction();
    void someCFunction();
    void aWrapper();
}

请注意,这不是有效的C代码,因此您需要将extern "C"声明包装在预处理器宏中。

在OS X和iOS上,您可以在编译C ++源时使用__BEGIN_DECLS__END_DECLS将希望链接为C代码的代码括起来,您不需要担心使用其他预处理器技巧使其成为有效的C代码。

因此,它看起来像:

// cHeader.h

__BEGIN_DECLS
void someCplusplusFunction();
void someCFunction();
void aWrapper();
__END_DECLS

编辑:正如ephermer提到的,您可以使用以下预处理器宏:

EDIT: 如ephemer所述,您可以使用以下预处理器宏:

// cHeader.h

#ifdef __cplusplus 
extern "C" { 
#endif 
void someCplusplusFunction();
void someCFunction();
void aWrapper();
#ifdef __cplusplus 
}
#endif

谢谢!它在这个例子中完美地工作。Xcode仍然不想链接真正的项目,但我会继续调查。 - popisar
我找到了真实项目的问题:我试图将一个字符串作为参数传递给C++函数。根据我的阅读,Swift的String应该自动转换为C的**const char***,但我想我可能漏掉了什么... - popisar
如果我能够实践我所编写的代码就好了...在我的代码中,我混淆了const char和char。 总之:@MaddTheSame给出了很好的答案。没有什么可补充的,只有感谢 :-) - popisar
2
您需要用预处理器宏包装 extern "C"声明,具体为:#ifdef __cplusplus extern "C" { #endif 在此处添加 C 函数定义... #ifdef __cplusplus } #endif。我无法在注释中使用换行符,但您需要在“extern C {”和“}”之前后添加换行符。 - ephemer
谢谢你,伙计 :) @MaddTheSane - Piyush Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接