我创建了一个C文件:

int main() {
  return 1;
}


我使用Zig的translate-c命令行选项生成了一个zig文件,并且我只得到了一些全局变量声明,例如

pub const __GCC_ATOMIC_TEST_AND_SET_TRUEVAL = 1;
pub const __FLT16_MAX_EXP__ = 15;
pub const __BIGGEST_ALIGNMENT__ = 16;
pub const __SIZEOF_FLOAT__ = 4;
pub const __INT64_FMTd__ = c"ld";
pub const __STDC_VERSION__ = c_long(201112);
... // and many


找不到main函数。但是,如果我将函数名称更改为myFunction,如下所示:

int myFunction(int a) {
  return a;
}


当我重新生成一个函数时出现:

pub export fn myFunction(a: c_int) c_int {
    return a;
}


我想念什么吗? Zig的translate-c函数的规则是什么?

最佳答案

当询问此问题时,translate-c尚不支持带有未指定参数的函数。通过使用--verbose-cimport可以看到:

test.c:1:5: warning: unsupported type: 'FunctionNoProto'
test.c:1:5: warning: unable to resolve prototype of function 'main'


在C语言中,如果您将参数留空,则实际上不是零参数,未指定。您必须使用void表示“无参数”。

这就是第二个示例起作用的原因-因为参数列表不为空。

但是,从e280dce3开始,Zig支持使用未指定的参数转换C函数,问题中的示例变成了以下Zig代码:

pub export fn main() c_int {
    return 1;
}

07-26 09:35