如果程序编译了调试标志-g
,我希望添加一些额外的信息记录。我使用gfortran(虽然我认为if (compiledwithg()) then
print *, extraNiceInfo
endif
无处不在)。在这种情况下,单步执行程序在gdb中尤其繁琐。特别是,我希望有类似的东西:
#ifdef DEBUG
我知道在C程序中,人们通常会使用像{{1}}这样的东西,然后打印一些额外的信息。据我所知,Fortran中没有类似的功能。有谁知道这样的事情?
答案 0 :(得分:5)
回答问题:是的,现在可以在现代版本的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
和
> gfortran-7 compiled_with_g.f90
> ./a.out
F
> gfortran-7 -g compiled_with_g.f90
> ./a.out
T
注意,它将在以-g
开头或只包含子串-g
的任何编译器选项上触发为true。我尝试使用" -g "
,但是当字符串以此选项开头或结尾时,它会出现问题。您也可以将这两种特殊情况添加到if条件中。
您可以在任何地方使用#ifdef DEBUG
并使用-cpp
或-fpp
编译所有来源(取决于编译器)。
或者您可以在模块中定义全局常量
#ifdef DEBUG
logical, parameter :: compiled_with_g = .true.
#else
logical, parameter :: compiled_with_g = .false.
#endif
使用-cpp
或-fpp
编译此模块。
您可以对函数compiledwithg()
执行相同的操作,并仅在函数中使用宏。
或者您可以拥有这个非常小的模块的两个版本:
module debug_mod
logical, parameter :: debug = .true.
end module
和
module debug_mod
logical, parameter :: debug = .false.
end module
并设置您的构建系统(如Makefile)以使用正确的构建系统。如果参数为false,编译器将删除死代码,因此它与宏一样有效。