当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Julia @ccall用法及代码示例


用法:

@ccall library.function_name(argvalue1::argtype1, ...)::returntype
@ccall function_name(argvalue1::argtype1, ...)::returntype
@ccall $function_pointer(argvalue1::argtype1, ...)::returntype

调用 C-exported 共享库中的函数,由 library.function_name 指定,其中 library 是字符串常量或文字。该库可以省略,在这种情况下,function_name 在当前进程中被解析。或者,@ccall 也可用于调用函数指针 $function_pointer ,例如由 dlsym 返回的函数指针。

通过自动插入对 unsafe_convert(argtype, cconvert(argtype, argvalue)) 的调用,每个 argvalue@ccall 都将转换为相应的 argtype 。 (有关更多详细信息,另请参阅 unsafe_convert cconvert 的文档。)在大多数情况下,这只会导致调用 convert(argtype, argvalue)

例子

@ccall strlen(s::Cstring)::Csize_t

这将调用 C 标准库函数:

size_t strlen(char *)

使用名为 s 的 Julia 变量。另见ccall

以下约定支持可变参数:

@ccall printf("%s = %d"::Cstring ; "foo"::Cstring, foo::Cint)::Cint

分号用于将必需的参数(其中必须至少有一个)与可变参数分开。

使用外部库的示例:

# C signature of g_uri_escape_string:
# char *g_uri_escape_string(const char *unescaped, const char *reserved_chars_allowed, gboolean allow_utf8);

const glib = "libglib-2.0"
@ccall glib.g_uri_escape_string(my_uri::Cstring, ":/"::Cstring, true::Cint)::Cstring

如果需要,也可以在函数名之前直接使用字符串文字 "libglib-2.0".g_uri_escape_string(...

相关用法


注:本文由纯净天空筛选整理自julialang.org 大神的英文原创作品 Base.@ccall — Macro。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。