首页 > 解决方案 > 使用可变参数动态调用 C 库函数

问题描述

我目前正在编写自己的编程语言,其目标与 C 类似。我的编译目标是 LLVM。

我列表中的下一项是编译时代码执行。为了使它有用,我需要能够调用内置函数。我正在从 C 标准库中自动生成函数原型,以便能够从我的语言中调用它们。现在,为了在解释 CALL 指令时调用这些函数,我想到了用一个更通用的函数包装函数原型,该函数接受 avoid*作为参数和结果。在我的语言中,包装器看起来像这样:

export import def #extern gethostname(__name: *char, __len: ulong) -> int
def _Fgethostname(args: [*], ret: *) {
    @(ret !*int) = gethostname(@(args[0] !**char), @(args[1] !*ulong))
}

这个想法是我可以将函数指针与函数名一起存储在一个数组中,以便能够在编译时选择正确的函数。

翻译成 C 的包装器是这样的:

int gethostname(__name: *char, __len: unsigned long)
void _Fgethostname(void **args, void *ret) {
    *((int*)ret) = gethostname(*((char**)args[0]), *((unsigned long*)args[1]))
}

只要正确布置内存,这应该可以工作。遗憾的是,我的方法不适用于可变参数函数。

我知道 Python 可以调用 C 函数,即使使用可变参数。我错过了什么?

标签: clanguage-design

解决方案


推荐阅读