环境: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字符串值的结果如下所示:
convertResult
为nil,控制台会告诉您“致命错误:在解包可选值时意外发现nil”我整天在Google和StackOverFlow上搜索,并找到有关此错误的任何内容。
答案 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();
这将解决问题,因为从函数返回时函数静态对象不会被破坏。