【发布时间】:2014-01-02 23:06:07
【问题描述】:
我正在研究 Red/System 如何使用 #import 语法与来自 Windows DLL、Linux/Android .so 共享库和 OS/X .dylib 的 C 库函数挂钩:
#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*,使其不再为 null。
作为第一次尝试,我做到了:
getline: "getline" [
lineptr [byte-ptr!] ;-- char **
n [pointer! [integer!]] ;-- size_t *
stream [byte-ptr!] ;-- FILE *
return: [integer!] ;-- ssize_t
]
但由于没有 pointer! [c-string!] 或类似的东西,我不知道如何调用它。我可以获取c-string! 局部变量的地址并将其作为byte-ptr! 以某种方式传递吗?
【问题讨论】:
标签: pointers shared-libraries getline red red-system