如何访问fortran模块中的私有变量?
我知道私有变量的概念是它们不应该被访问,我确实希望它在程序的其余部分使用模块时能以这种方式工作,但我需要它来检查模块的内部工作 假设我有以下简化示例:如何访问fortran模块中的私有变量?,fortran,Fortran,我知道私有变量的概念是它们不应该被访问,我确实希望它在程序的其余部分使用模块时能以这种方式工作,但我需要它来检查模块的内部工作 假设我有以下简化示例: module mod implicit none private integer :: value public :: set_value contains subroutine set_value(input) implicit none integer,intent(in) :: input value=inp
module mod
implicit none
private
integer :: value
public :: set_value
contains
subroutine set_value(input)
implicit none
integer,intent(in) :: input
value=input
end subroutine
end module
现在我想测试子程序,看看它是否真的在做我想做的事情:我想写一个程序,使用这个模块,用输入8调用例程set\u value
,然后检查内部变量value
现在是否为8
我能做这个吗?还是有其他方法可以对私有变量的初始值设定项进行单元测试?在我看来,有三种方法
protected
属性而不是private
属性声明变量。这将允许从任何代码中读取变量,但不允许修改。这将强制它只能通过setter函数进行设置,但您可以在单元测试中直接检查它的值
integer, protected :: value
module mod
implicit none
private
integer :: value
public :: set_value
#ifdef UNITTESTING
public :: value
#endif
contains
...
end module
然后将文件名从.f90
更改为.f90
,以便对其进行预处理(至少在gfortran和ifort上)。正常编译时,value
将是私有的,但如果改为使用标志-dunitesting
编译,则value
将是公共的。当您编译测试用例时,您使用该标志,他们现在可以直接检查变量编写一个
get_value
函数并使用它进行测试。即使我只将该函数用于测试?另外,我不是要同时测试这两个例程吗?如果你不想跟随@casey,只需将其设置为public进行测试,然后再将其设置为private!请不要用条件编译。。。另一种选择可能会受到保护,见@IanBush谢谢,我已经忘记了。我已经添加了这一点,但保留了条件编译部分,以防他们使用的是一个古老的编译器。太棒了!但我不会删除注释,因为条件编译是邪恶的!!!!!!(坐下来,等待评论)(但我诚实地认为,这只是一种更糟糕的全局变量形式)测试私有函数和子例程怎么样?我不同意@IanBush关于连续编译的观点,对我来说,这是最不具侵入性的解决方案。我们中的一些人被Fortran 90困住了。。。