swift call c

這篇提到如何使用 swift call c language

因為 swift 在建立 symbol 時,會用到 name mangling

我們可以 @_silgen_name 去指定 symbol 名稱

指定 symbol 名稱
1
2
3
4
5
// symbol: swift_add
@_silgen_name("swift_add")
public func swift_add(a:Int32,b:Int32) -> Int32 {
return a+b
}

或者將特定的 symbol 轉成我們要的 swift interface

將特定的 symbol 轉成我們要的 swift interface
1
2
@_silgen_name("add") 
public func c_add(a:Int32,b:Int32) -> Int32

SwiftSocket 使用案例

TCPClient.swiftlink
1
2
@_silgen_name("ytcpsocket_connect") 
private func c_ytcpsocket_connect(_ host:UnsafePointer<Byte>,port:Int32,timeout:Int32) -> Int32
ytcpsocket.clink
1
2
3
int ytcpsocket_connect(const char *host, int port, int timeout) {
// ...
}

siwft @_silgen_name 實作 What is ‘@_silgen_name’ in Swift language?

這篇提到 Attr.cpp 如何定義屬性

以及 Attr.def 以定義的屬性

其他參考

個人實作

add.c
1
2
3
4
int yume_add(int a,int b) {
printf("int size:%lu\n",sizeof(int));
return a+b;
}
main.swift
1
2
3
4
5
6
7
8
import Foundation

@_silgen_name("yume_add")
func c_yume_add(a:Int32,b:Int32) -> Int32

let r = c_yume_add(a:10,b:20)
print("Hello, world!")
print("r:\(r)")
1
2
3
4
5
llvm-gcc -c add.c
nm add.o
# 0000000000000000 T _yume_add
swiftc -target x86_64-apple-macosx10.12 add.o main.swift
./main