【问题标题】:What is a handy way to make a novel Fortran library callable from C什么是使新颖的 Fortran 库可从 C 调用的便捷方法
【发布时间】:2012-07-03 12:52:13
【问题描述】:

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

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

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

【问题讨论】:

  • 对于在一种编程方法和另一种编程方法之间进行选择,我不理解“舒适”一词的使用。我怀疑它指的是主观和有争议的软件因素,因此在 SO 上这个问题在这里是不可接受的。如果我误解了您的意图,请澄清。
  • @HighPerformanceMark 同意,重新表述我的问题。
  • 我仍然认为这个问题引起了意见和品味的问题。例如,我认为real(kind=C_DOUBLE) 是完全可读的,我对你的问题的“回答”有更好的方法...否。 我会去进一步说,用语言编程而不是围绕语言编程是通往幸福、满足和成功的途径。但请注意,这只是评论,我不提供答案。
  • @HighPerformanceMark 实际上我是最重要的 C/C++ 程序员,我不知道有关这种情况的传统 Fortran 实践。因此,如果答案是使用 kind=C_DOUBLE,因为我对此类代码有丰富的经验,而且它完全可读,那么它可能是可以接受的答案。

标签: fortran fortran90 gfortran


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2014-03-24
    • 2015-04-06
    • 1970-01-01
    • 2011-11-24
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多