【问题标题】:Call a C++ function from Swift从 Swift 调用 C++ 函数
【发布时间】:2025-11-25 07:45:01
【问题描述】:

我应该如何从 Swift 文件中调用 C++ 函数(不涉及类)? 我试过这个:

someCFunction.c 中:

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

void aWrapper() {
    someCplusplusFunction();
}

someCpluplusfunction.cpp中:

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

ma​​in.swift 中:

someCFunction();
aWrapper();

Bridging-Header.h 中:

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

我发现this answer 信息量很大,但我仍然无法让它发挥作用。 你能指出我正确的方向吗?

谢谢!

【问题讨论】:

    标签: c++ c xcode swift linker


    【解决方案1】:

    标题是什么样的?

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

    // cHeader.h
    
    extern "C" {
        void someCplusplusFunction();
        void someCFunction();
        void aWrapper();
    }
    

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

    在 OS X 和 iOS 上,您可以在编译 C++ 源代码时在您希望链接为 C 代码的代码周围使用 __BEGIN_DECLS__END_DECLS,并且您无需担心使用其他预处理器技巧使其有效C 代码。

    因此,它看起来像:

    // cHeader.h
    
    __BEGIN_DECLS
    void someCplusplusFunction();
    void someCFunction();
    void aWrapper();
    __END_DECLS
    

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

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

    【讨论】:

    • 谢谢!它非常适合这个例子。 Xcode 仍然不想链接真实项目,但我会继续调查。
    • 我发现了实际项目的问题:我试图将一个字符串作为参数传递给 C++ 函数。根据我的阅读,Swift String 应该自动转换为 C const char*,但我想我遗漏了一些东西......
    • 如果我只编写我所宣扬的内容...在我的代码中,我混淆了 const char*char*。继续:@MaddTheSame 给出了很好的答案。没什么可补充的,但谢谢:-)
    • “您需要将extern "C" 声明包装在预处理器宏中”,特别是:#ifdef __cplusplus extern "C" { #endif 您的 C 函数定义在这里...#ifdef __cplusplus } #endif。我不能在评论中添加换行符,但你需要在“extern C {”和“}”之前和之后换行
    • 谢谢队友 :) @MaddTheSane