Fortran是否有一个与C assert等效的标准函数/关键字?
我找不到Fortran2003标准中提到的Fortran2003。我已经找到了一些如何使用预处理器的方法,但是在这个回答中,建议编写自己的断言。不使用预处理器就可以创建这样的用户函数/子例程吗?
我希望这些断言对于发行版构建是禁用的。
发布于 2014-02-12 09:53:08
据我所知,在Standard中没有这样的语句或函数/子程序。但是--正如您已经说过的--您可以在Fortran中使用自己的子程序/函数和/或OOP来实现这个目标。请参阅Arjen关于此主题的优秀纸。
发布于 2014-02-12 13:08:18
在Fortran中,条件编译从来没有真正流行过,也没有标准的预处理器。如果让你的预处理器切换一个虚拟断言例程不是你想要解决的事情,你可以.
定义一个全局参数,例如:
logical, parameter :: debugging = .true.如果你有紧张的性格,你可以把它放到一个模块中,并使用--将它关联到需要它的每个范围;在我看来,在这里使用全局参数似乎是一种合理的方法。
然后编写有保护的测试,如
if (debugging) call assert(...)一旦您想要发布代码,请将debugging的值设置为.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。不过,我怀疑编译器可能不会完全消除对空子例程的调用,而且您的生产代码可能会对它遇到的每一个断言都付出很小的代价。
除此之外,请参阅Arjen Markus的论文,@AlexanderVogt已经向您推荐了这篇文章。
发布于 2014-07-14 07:50:22
对于固定表单源,可以使用-fd-lines-as-comments发布版本,使用-fd-lines-as-code进行调试构建(IntelFortran-d-lines),并使用自定义断言:
D if (assert_condition) then
D write(*,*) 'assert message'
D call exit(1)
D endifhttps://stackoverflow.com/questions/21724186
复制相似问题