条件编译在 Fortran 中从未真正流行起来,并且没有标准的预处理器。如果让你的预处理器切换进出虚拟断言例程不是你想要解决的问题,你可以......
定义一个全局参数,例如:
logical, parameter :: debugging = .true.
如果您性格紧张,您可以将其放入一个模块中,并将其使用关联到需要它的每个范围中;在我看来,使用全局参数似乎是一种合理的方法。
然后编写受保护的测试,例如
if (debugging) call assert(...)
一旦你想释放代码,设置值debugging
to .false.
我希望,尽管我还没有对此进行测试,所以您可能会关心,任何当前的 Fortran 编译器在遇到相当于以下的表达式时都可以删除死代码
if (.false.) call assert(...)
并且您发布的代码不会因对某个对象的虚拟调用而受到惩罚assert
常规。
另一种方法可能是创建一个模块,我们称之为assertions
,沿着这些思路:
module assertions
contains
subroutine assert_prd(args)
! declare args
end subroutine
subroutine assert_dbg(args)
! declare args
! now do do some assertion checking and exception raising, etc
end subroutine
end module assertions
然后,您可以在使用关联子例程时重命名它们,例如:
use, non_intrinsic :: assertions, assert=>assert_dbg
并将其更改为assert=>assert_prd
当你想关闭断言检查时。我怀疑编译器可能不会完全消除对空子例程的调用,并且您的生产代码可能会为其遇到的每个断言付出小小的代价。
除此之外,请参阅 @AlexanderVogt 向您推荐的 Arjen Markus 的论文。