我正在研究 Red/System 如何与来自 Windows DLL、Linux/Android .so 共享库和 OS/X .dylib 的 C 库函数挂钩,#import
语法如下:
#import [
"libc.so.6" cdecl [
allocate: "malloc" [
size [integer!]
return: [byte-ptr!]
]
free: "free" [
block [byte-ptr!]
]
/* ... */
]
适用于所有基本类型,但是当函数需要指向指针的指针时该怎么办?例如,如果你试图绑定到类似 的东西getline()
,它有原型:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
一种调用方式(我想调用它的方式......)是传入的 lineptr 不是预分配的缓冲区,而是null
. 在这种情况下,getline 会为您分配缓冲区并修改 char* 使其不再为空。
作为第一次尝试,我做了:
getline: "getline" [
lineptr [byte-ptr!] ;-- char **
n [pointer! [integer!]] ;-- size_t *
stream [byte-ptr!] ;-- FILE *
return: [integer!] ;-- ssize_t
]
但由于没有 apointer! [c-string!]
或类似的东西,我不知道如何称呼它。我可以获取c-string!
局部变量的地址并将其作为byte-ptr!
某种方式传递吗?