gpt4 book ai didi

debugging - 在 Fortran 程序中,检查是否使用 "-g"进行编译

转载 作者:行者123 更新时间:2023-12-02 23:29:00 25 4
gpt4 key购买 nike

如果程序编译了调试标志-g,我希望添加一些额外的信息记录。我正在使用 gfortran (尽管我认为 -g 无处不在)。在这种情况下,在 gdb 中单步执行程序会特别乏味。我特别希望这样的事情:

if (compiledwithg()) then
print *, extraNiceInfo
endif

我知道在 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

> 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,编译器将删除死代码,因此它与宏一样高效。

关于debugging - 在 Fortran 程序中,检查是否使用 "-g"进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com