0

我正在开发一个小型 Fortran 库(新颖的代码),它被多个 C/C++ 应用程序调用。当几乎每个子例程都可以从应用程序中单独调用时,该库就是这样的。所以我需要为这些子程序提供 C 接口。

  • 我可以使用模块,这些模块本身就很舒服。但是然后我需要手动解码模块名称修改(这对 gfortran 来说不是很难,但看起来很糟糕)或使用bind(C,name="some_name")子句。最后一个导致编译器警告,例如子例程参数没有明确地可互操作(例如,编译器希望我用 替换double precisionreal(kind=C_DOUBLE)。在这种情况下,我应该用如此丑陋的声明替换库中的几乎每个变量,这会导致代码阅读困难。
  • 当库中的每个文件都包含几个子例程时,我可以使用子例程(这就是我现在所做的方式)。显式地在它们之间提供接口,interface ... include "otherfile_h.f90" ... end interface这不是很舒服。在这种情况下,名称修改相当简单,库子例程可以很容易地直接从 C 中调用。

我使用的方法(bullet #2)需要更多的输入,而且由于在源/头文件中重复定义而容易出错。有没有更好的方法来使用智能 C 接口保持源代码清晰可读?

4

1 回答 1

2

混合 Fortran 和 C 的现代方法是使用 Fortran 的 ISO C 绑定。这将使您的代码可移植,因为 ISO C 绑定是语言标准的一部分。手动确定名称修饰是特定于编译器的,可能不适用于其他编译器。“双精度”不被认为是现代 Fortran 的最佳实践声明(参见,例如,扩展双精度http://fortranwiki.org/fortran/show/Modernizing+Old+Fortran)。现代的方式是使用“real (kind=XYZ)”。该语言的概念是程序员通常使用 SELECTED_REAL_KIND 内部函数来定义他们需要的精度的常量(例如,MyDouble)。如果您需要的精度是 C_DOUBLE,那么 Fortran 使用这种类型的值是非常合适的。这不是一个丑陋的声明。(我不明白你的子弹#2。)

于 2012-07-03T13:48:42.183 回答