我正在开发一个小型 Fortran 库(新颖的代码),它被多个 C/C++ 应用程序调用。当几乎每个子例程都可以从应用程序中单独调用时,该库就是这样的。所以我需要为这些子程序提供 C 接口。
- 我可以使用模块,这些模块本身就很舒服。但是然后我需要手动解码模块名称修改(这对 gfortran 来说不是很难,但看起来很糟糕)或使用
bind(C,name="some_name")
子句。最后一个导致编译器警告,例如子例程参数没有明确地可互操作(例如,编译器希望我用 替换double precision
)real(kind=C_DOUBLE)
。在这种情况下,我应该用如此丑陋的声明替换库中的几乎每个变量,这会导致代码阅读困难。 - 当库中的每个文件都包含几个子例程时,我可以使用子例程(这就是我现在所做的方式)。显式地在它们之间提供接口,
interface ... include "otherfile_h.f90" ... end interface
这不是很舒服。在这种情况下,名称修改相当简单,库子例程可以很容易地直接从 C 中调用。
我使用的方法(bullet #2)需要更多的输入,而且由于在源/头文件中重复定义而容易出错。有没有更好的方法来使用智能 C 接口保持源代码清晰可读?