我有一个 Fortran 模块,其中包含一些具有属性的变量parameter
有些有属性save
. The 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
变量就在那里。我知道我可以改变thisIsParametered
to save
而不是parameter
但是,理想情况下,我想阻止链接用户更改此值。有没有办法做到这一点?
Edit:我希望 C 代码也可以访问这个库,而不仅仅是 Fortran。
它实际上应该存储在 .mod 文件中。所有数据类型和函数原型都存储在那里,这就是为什么当您向某人发送 .lib 文件时需要包含它。在其他地方使用模块后尝试链接该模块,它应该可以正常工作。
本质上,.mod 文件与 c 中的 .h 文件具有相同的用途,因此您当然必须将其包含在您的库中。
[更新:]
如果您尝试在 C 中使用它,那么正如您所说,您无法轻松维护命名常量。作为替代方案,您可以在实体上使用 protected 属性。至少对于 Fortran,模块外部的任何内容都被限制写入变量。我不知道 C 编译器和链接器是否会尊重这种行为,但我认为这可能是你最好的选择。
module testMOD
INTEGER, PROTECTED, BIND(C) :: globalvar = 1
end module testMOD
不幸的是,我并没有在与 C 的互操作性方面做太多工作,所以我不能真正保证 C 会尊重 protected 属性并且不允许更改变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)