Debugging 在Fortran程序中,检查是否使用-g";
如果一个程序被编译成调试标志,Debugging 在Fortran程序中,检查是否使用-g";,debugging,fortran,gfortran,Debugging,Fortran,Gfortran,如果一个程序被编译成调试标志,-g,我希望添加一些额外的信息日志记录。我正在使用gfortran(尽管我认为-g无处不在)。在这种情况下,在gdb中单步执行程序将特别乏味。特别是,我希望有这样的事情: if (compiledwithg()) then print *, extraNiceInfo endif 我知道在C程序中,人们通常会使用诸如#ifdef DEBUG,然后打印一些附加信息。据我所知,Fortran中没有类似的功能。有人知道这样的事情吗?回答您的问题:是的,在现代版本
-g
,我希望添加一些额外的信息日志记录。我正在使用gfortran(尽管我认为-g
无处不在)。在这种情况下,在gdb中单步执行程序将特别乏味。特别是,我希望有这样的事情:
if (compiledwithg()) then
print *, extraNiceInfo
endif
我知道在C程序中,人们通常会使用诸如
#ifdef DEBUG
,然后打印一些附加信息。据我所知,Fortran中没有类似的功能。有人知道这样的事情吗?回答您的问题:是的,在现代版本的Fortran中,现在可以知道编译时使用了哪些选项。正如francescalus所链接的那样,COMPILER\u 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
及
注意,它将在任何以-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
及
并将构建系统(如Makefile)设置为使用正确的系统。如果参数为false,编译器将删除死代码,因此它与宏一样有效。您可以经常了解程序是如何编译的。ifdef调试也可以在Fortran中使用!只需启用预处理器。其原因是在不使用这些if检查时,甚至不编译它们。@Gavin:使用函数
compiled\u with\u g()
创建一个返回始终为true的源文件怎么样?如果一些源文件要用-g
编译,而另一些则不是,那么在make文件中创建一条规则,根据每个源文件生成此函数如何?但是使用@Vladimir提出的预处理器,肯定是最好的解决方案。函数是不必要的,一个全局常数就足够了。
module debug_mod
logical, parameter :: debug = .true.
end module
module debug_mod
logical, parameter :: debug = .false.
end module