【发布时间】: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