Um Ihre Frage so zu beantworten, wie sie gestellt wurde: Ja, in modernen Versionen von Fortran ist es jetzt möglich zu wissen, welche Optionen für das Kompilieren verwendet wurden. Wie von Francescalus verlinkt, ist die COMPILER_OPTIONS()
Unterroutine der Weg zu gehen.
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
und
> gfortran-7 compiled_with_g.f90
> ./a.out
F
> gfortran-7 -g compiled_with_g.f90
> ./a.out
T
Hinweis, es wird wahr auslösen auf jeder Compiler-Option, die mit -g
beginnt oder gerade enthält Teilzeichenfolge -g
. Ich versuchte mit " -g "
, aber es ist problematisch, wenn der String mit dieser Option beginnt oder endet. Sie können diese beiden Sonderfälle auch nur zur if-Bedingung hinzufügen.
können Sie die #ifdef DEBUG
überall verwenden und alle Quellen mit -cpp
oder -fpp
(je nach Compiler) kompilieren.
Oder Sie können in einem Modul
#ifdef DEBUG
logical, parameter :: compiled_with_g = .true.
#else
logical, parameter :: compiled_with_g = .false.
#endif
und kompilieren nur dieses Modul mit -cpp
oder -fpp
eine globale Konstante definieren.
Sie können das gleiche mit einer Funktion compiledwithg()
tun und haben das Makro nur in der Funktion.
Oder Sie können zwei Versionen dieses sehr kleinen Modul haben:
module debug_mod
logical, parameter :: debug = .true.
end module
und
module debug_mod
logical, parameter :: debug = .false.
end module
und stellen Sie Ihr Build-System (wie ein Makefile) das Recht zu verwenden. Der Compiler wird dann den toten Code entfernen, wenn der Parameter falsch ist, also ist er genauso effizient wie ein Makro.
Sie können oft [Details] (https://Stackoverflow.com/q/46464763/3157076) erhalten, wie ein Programm erfüllt wurde. – francescalus
Der ifdef DEBUG kann auch in Fortran verwendet werden! Aktivieren Sie einfach den Präprozessor. Der Grund dafür ist, diese Checks nicht einmal zu kompilieren, wenn sie nicht verwendet werden. –
@Gavin: Was ist mit dem Erstellen einer Quelldatei mit der Funktion 'compiled_with_g()', die immer wahr zurückgibt? Wenn einige Quelldateien mit '-g' kompiliert werden sollen und andere nicht, dann müssen Sie eine Regel in der make-Datei erstellen, die diese Funktion pro Quelldatei generiert.Aber die Verwendung des Präprozessors wird von @Vladimir vorgeschlagen, sicherlich ist die beste Lösung – mszmurlo