Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 在Fortran程序中,检查是否使用-g";_Debugging_Fortran_Gfortran - Fatal编程技术网

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