【问题标题】:How to pass-by-reference from Swift to C library如何通过引用从 Swift 传递到 C 库
【发布时间】:2019-08-07 05:13:33
【问题描述】:

我正在为 Windows 和 macOS 创建一个用 C 编写的跨平台库,我需要通过引用传递一个变量。如何在 C 中定义函数以便它可以接收通过引用传递的变量,以及如何在 Swift 中调用该函数?

例如,如果我要在我的 C 库中定义一个函数,例如:

int sayBye(const char* greetingString){
    greetingString = "bye";
    return 0;
}

并在 Swift 中调用它:

var greeting: String = "hello"
let responseCode = sayBye(greeting)
print(greeting)

我希望打印语句输出“再见”。

约束:return 语句中不能返回“bye”。

简而言之,我想在字符串“greeting”通过引用 C 函数后修改其内容。

注意:我不确定在上面的代码中,我是否正确定义了 C 函数,或者我是否在 swift 中正确调用它,我愿意接受建议。

【问题讨论】:

  • 迂腐提示:C 没有传递引用
  • C 函数是完全按值传递的。没有传递引用。如果您希望函数能够更改调用者的局部变量,则必须为其提供指向该变量的指针。不知道如何在 Swift 中做到这一点。
  • 您的代码的问题在于,C 并不真正支持按引用传递,您必须通过将指针传递给您想要的变量来模拟它通过引用传递。对于指针变量,这意味着您必须将指针 传递给指针。代码如图所示,由于传递给函数的指针是按值传递的,因此赋值只修改了局部变量,即你在函数中的副本。唯一的解决方案是更改指针指向的内存内容,例如strcpy,如果内容是不变的,这是一种展示停止器。
  • 您想修改const char* 的内容吗?你不能。

标签: c swift


【解决方案1】:

找到一些有用的东西。

在 C 库中:

int sayBye(const char** greetingString){
    *greetingString = "bye";
    return 0;
}

在 Swift 中调用:

var greeting = ("hello" as NSString).utf8String
let responseCode = sayBye(&greeting)
let stringFromPointer = String.init(cString: greeting!)

print(stringFromPointer)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2011-01-17
    • 2017-12-04
    • 2019-10-04
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多