2017-11-30 2 views
2

Ich hoffe, einige zusätzliche Info-Protokollierung hinzufügen, wenn ein Programm kompiliert das Debug-Flag, -g. Ich benutze Gfortran (obwohl ich denke, -g ist allgegenwärtig). Das Durchlaufen des Programms wäre in diesem Fall besonders mühsam in gdb. Insbesondere hoffe ich, so etwas wie:Überprüfen Sie in Fortran-Programm, ob kompiliert mit "-g"

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

Ich weiß, in C-Programmen Leute würden in der Regel Sachen wie #ifdef DEBUG verwenden, dann einige zusätzliche Informationen drucken. Soweit ich weiß, gibt es in Fortran keine ähnliche Funktion. Weiß jemand von so etwas?

+2

Sie können oft [Details] (https://Stackoverflow.com/q/46464763/3157076) erhalten, wie ein Programm erfüllt wurde. – francescalus

+2

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. –

+0

@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

Antwort

5

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.

Verwandte Themen