Gav*_*ley 2 debugging fortran gfortran
我希望在程序编译调试标志时添加一些额外的信息记录-g.我正在使用gfortran(虽然我认为-g无处不在).在这种情况下,单步执行程序在gdb中尤其繁琐.特别是,我希望有类似的东西:
if (compiledwithg()) then
print *, extraNiceInfo
endif
Run Code Online (Sandbox Code Playgroud)
我知道在C程序中人们通常会使用类似的东西#ifdef DEBUG,然后打印一些额外的信息.据我所知,Fortran中没有类似的功能.有谁知道这样的事情?
要回答你提出的问题:是的,现在可以在现代版本的Fortran中知道哪些选项用于编译.由francescalus联系,COMPILER_OPTIONS()子程序是要走的路.
use iso_fortran_env
logical :: compiled_with_g
character(:), allocatable :: options
options = compiler_options()
compiled_with_g = index(options, "-g") > 0
print *, compiled_with_g
end
Run Code Online (Sandbox Code Playgroud)
和
> gfortran-7 compiled_with_g.f90
> ./a.out
F
> gfortran-7 -g compiled_with_g.f90
> ./a.out
T
Run Code Online (Sandbox Code Playgroud)
注意,它将在以-g或仅包含子字符串的任何编译器选项上触发true -g.我尝试使用" -g ",但是当字符串以此选项开始或结束时,它会出现问题.您也可以将这两个特殊情况添加到if条件中.
您可以在#ifdef DEBUG任何地方使用并使用-cpp或编译所有源-fpp(取决于编译器).
或者,您可以在模块中定义全局常量
#ifdef DEBUG
logical, parameter :: compiled_with_g = .true.
#else
logical, parameter :: compiled_with_g = .false.
#endif
Run Code Online (Sandbox Code Playgroud)
用-cpp或编译这个模块-fpp.
您可以对函数执行相同操作,compiledwithg()并仅在函数中使用宏.
或者您可以拥有这个非常小的模块的两个版本:
module debug_mod
logical, parameter :: debug = .true.
end module
Run Code Online (Sandbox Code Playgroud)
和
module debug_mod
logical, parameter :: debug = .false.
end module
Run Code Online (Sandbox Code Playgroud)
并设置您的构建系统(如Makefile)以使用正确的.如果参数为false,编译器将删除死代码,因此它与宏一样有效.
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |