4

我有一个 Fortran 模块,其中包含一些具有属性的变量parameter和一些具有属性的变量save。这些parameter不包含在编译对象中,这在尝试组装库时会成为问题。例如,考虑一个文件testModule.f90

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD

我编译这个:ifort -c testModule.f90。当我检查里面的东西时:

>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

只有thisIsSaved变量在那里。我知道我可以更改thisIsParameteredsave而不是parameter,但理想情况下,我想阻止链接用户更改此值。有没有办法做到这一点?

编辑:我希望这个库也可以被 C 代码访问,而不仅仅是 Fortran。

4

2 回答 2

4

正如其他人所指出的,参数是命名常量,实现可能不会在目标代码中为该常量留出存储空间(特别是对于标量)。

你的库应该为你的 C 客户端提供一个头文件。您可以通过#define 或const 在该头文件中定义Fortran 参数的值。

这需要在两个地方维护参数的值,但是您已经在库接口的其他方面承担了维护负担。

于 2013-02-05T00:31:32.397 回答
4

这实际上应该存储在 .mod 文件中。所有的数据类型和函数原型都存储在那里,这就是为什么在向某人发送 .lib 文件时需要包含它的原因。在将其用于其他内容后尝试在模块中进行链接,它应该可以正常工作。

本质上,.mod 文件与 c 中的 .h 文件具有相同的用途,因此您当然必须将它包含在您的库中。

[更新:]如果您尝试在 C 中使用它,那么正如您所说,您无法轻松维护命名常量。作为替代方案,您可以在实体上使用受保护的属性。至少对于 Fortran,模块之外的任何内容都被限制写入变量。我不知道 C 编译器和链接器是否会尊重这种行为,但我认为这可能是你最好的选择。

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

不幸的是,我对与 C 的互操作性并没有真正做太多,所以我不能真正保证 C 会尊重受保护的属性并且不允许更改变量。

于 2013-02-04T20:23:37.020 回答