Swift:String.fromCString()有时不起作用

时间:2016-02-25 11:08:06

标签: swift macos

环境:Xcode 7.2.1,Swift 2.1.1,OS X 10.11.3。

首先,我使用Xcode创建一个osx项目(Cocoa Application);

然后我添加一个简单的c ++文件,如下所示:

#include <stdio.h>
#include <string>

extern "C"{
const char* test() {
    //std::string abc = "abc";
    //std::string abc = "abcdeabcde";
    //std::string abc = "abcdeabcdeabcde";
    std::string abc = "abcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxy";

    return abc.data();
}
}

并且,我通过test()通过AppDelegate.swift致电CStringTest-Bridging-Header.h方法:

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application
    let origin = test()
    let convertResult = String.fromCString(origin)
    print(convertResult!)
}

cpp文件中4字符串值的结果如下所示:

  1. 成功,结果是:abc
  2. 错误,结果是:abciݿ
  3. 错误convertResult为nil,控制台会告诉您“致命错误:在解包可选值时意外发现nil”
  4. 有时成功,打印超长字符串就像它定义的那样,而另一个不打印
  5. 我整天在Google和StackOverFlow上搜索,并找到有关此错误的任何内容。

1 个答案:

答案 0 :(得分:1)

您的C ++函数test()具有未定义的行为。您不能使用它来生成有效的C字符串,因为您调用std::string abc的变量data()是{em> local 到test()函数。

这就是为什么从test()返回的值在返回时变为无效的原因:在变量abc上调用析构函数,释放其数据并使返回无效&#34;悬空& #34;指针。

出于测试目的,您可以abc为静态,并拨打c_str()而不是data()

static std::string abc = "...";
return abc.c_str();

这将解决问题,因为从函数返回时函数静态对象不会被破坏。