外部函数声明
{ PUBLIC | PRIVATE } EXTERN
Identifier
(
[ Parameter AS Datatype [ , ... ] ]
)
[ AS Datatype ]
[ IN Library ] [ EXEC Alias ]
声明一个位于系统某个共享库中的外部函数。
参数
外部函数的参数可以是除了变体类型外的任意Gambas数据类型。
Gambas自动将其数据类型匹配到机器内部的数据类型。
传递一个对象时,函数接收一个指向其数据的指针。
如果对象是一个类,那么函数接收一个指向类的静态数据的指针。
对于任何指针参数,使用
Pointer数据类型。
可以使用
字符串参数,除非函数修改它,
因为在Gambas中字符串的内容是共享的常数。
指针参数
如果必须发送指针给变量,必须使用
VarPtr 函数,但是仅仅用于非字符串参数。
示例
EXTERN GetAFloat(Result AS Pointer, A AS Float, B AS Float)
DIM fResult AS Float
GetAFloat(VarPtr(fResult), Pi, Pi(2))
当外部函数的参数是内存大小类型(例如
size_t
)时,也要使用
Pointer ,因为这些类型与
void *
有的相同的整数大小。
函数回调
一些外部函数可能将函数指针作为参数,该函数指针被用作回调。
要将Gambas函数用作回调:
-
只需在外部函数声明中像
Pointer
那样声明函数指针参数即可。
-
使用Gambas函数名作为外部函数的参数。
示例
Private Extern qsort(base As Pointer, nmemb As Pointer, size As Pointer, compar As Pointer) In "libc:6"
Private Sub Compare(pA As Pointer, pB As Pointer) As Integer
...
End
Public Sub Main()
Dim aVal As Integer[]
...
qsort(aVal.Data, aVal.Count, 4, Compare)
...
End
请注意,可以使用任何私有的或公共的Gambas函数。
甚至可以使用非静态方法:但是请注意,该方法所应用的对象被回调捕获,
并且仅在程序结尾释放。
返回值
外部函数的返回值可以是除了
对象和
变体类型之外的
任意Gambas数据类型。
如果外部函数返回一个字符串,Gambas将返回它的一个副本。
如果需要函数返回真正的字符串,
可以使用
Pointer数据类型和
StrPtr函数。
库名
库名用
Library 参数指定。如果不指定库名,
那么使用最近的
LIBRARY
语句声明的库名。
库名必须是库的文件名,不包含任何扩展名和版本号。
例如,想使用的OpenGL库文件在系统中名为
libGL.so.1
,
那么在Gambas中使用的库名是
"libGL"
。
如果需要指定一个特定版本的库(在Linux中,版本号在
.so
扩展名之后),
可以用“:”分隔将版本号追加在库名之后。
例如,需要指定的1.0.7667版本的OpenGL库,
可以是用下面的库名:
"libGL:1.0.7667"
。
示例
' 需要进行IO控制!
EXTERN ioctl(fd AS Integer, op AS Integer, arg AS Pointer) AS Integer IN "libc:6"
...
Err = ioctl(MyStream.Handle, ... )
函数名
库里的函数名缺省是在Gambas中指定的函数名,
也就是~identifier~。
如果这个标识符不能用或者不可取,
可以用
EXEC
关键字指定真正的库函数名。
示例
' 该函数名已经是Gambas保留字!
EXTERN SysOpen(Name AS String, Flags AS Integer, Mode AS Integer) AS Integer IN "libc:6" EXEC "open"
参见