c - C 可变参数函数与 Fortran 的互操作性

标签 c fortran fortran90 fortran-iso-c-binding

有没有办法声明一个 C 可变参数函数并从 Fortran 调用它? 我需要调用此函数来计算标有字符串的 vector 之间的一些点积。 我的想法是声明类似下面的内容,其中参数的变量列表包含字符串文字。如果变量参数列表为空,那么我会在标准标签中查找并执行计算。如果用户指定了两个标签,我将检索这两个 vector 并获取它们的点积:

extern "C" void compute_dot_product(double * dot_product, ...)
{
    va_list args;
    va_start(args, NULL);
    char * label1 = va_arg(args, char *);
    if (!label1)
    {
       // Do standard label lookup and compute dot product
    }
    else
    {
       // Compute dot product between the vectors with the specified labels
       char * label2 = va_arg(args, char *);
    }
    va_end(args);
}

唯一的问题是我可以编译我的 C 库并将它链接到 Fortran 可执行文件,但是当我尝试访问变量参数列表时出现运行时错误。 知道我想做的事情是否可行吗? 一个可能的解决方案是分成两个函数:一个执行标准标签查找(0 参数情况),另一个处理非标准标签查找(2 参数情况)。不过,我宁愿避免使用这种解决方案。

最佳答案

不可能以符合标准(即可移植)的方式调用可变参数函数。

你可以让 C 函数的定义只接受两个参数(因此它不再是可变的 - 需要修改对函数的现有引用),C 函数中的第二个参数是一个指针,可以是 NULL 到表明没有额外的东西被传递,或者指向一个指针数组(可能以 NULL 终止)或其他任何东西,以及任何额外的东西。在 F201X 中,此类函数的接口(interface)主体可能能够将 OPTIONAL 属性用于第二个参数。

关于c - C 可变参数函数与 Fortran 的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672687/

相关文章:

c++ - 如何在c中为函数指定别名

fortran - .i. 是什么意思?在 Fortran 中引用?

python - 使用 Python 3 导入 f2py 模块时 undefined symbol

linux - 如何从 Fortran 代码中删除文件?

c++ - 为什么要先编译成目标文件?

matrix - Fortran 90 中矩阵的最大大小避免段错误

c - 如何避免 C 文件名中的 "\"问题?

无法在 DPDK 示例应用程序中传输数据包

c - 为什么/何时使用 `intptr_t` 在 C 中进行类型转换?

algorithm - 用于网络连接检查的位图有什么替代方法?