2017-11-30 4 views
2

プログラムがデバッグフラグ-gをコンパイルすると、追加情報ロギングを追加したいと考えています。私はgfortranを使用しています(私は-gがどこにでもあると思いますが)。この場合、プログラムを踏むことは、gdbでは特に面倒です。私はCプログラムで、人々は通常、いくつかの追加情報を印刷し、その後、#ifdef DEBUGようなものを使用します知っているFortranプログラムから、 "-g"でコンパイルされているかどうか確認してください

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

:特に、私のようなものを望んでいます。私が知る限り、Fortranには似たような機能はありません。誰もがこのようなことを知っていますか?

+2

多くの場合、プログラムがどのように遵守されたかについての詳細(https://stackoverflow.com/q/46464763/3157076)を得ることができます。 – francescalus

+2

ifdef DEBUGもFortranでも使用できます!プリプロセッサを有効にするだけです。その理由は、それらを使用していないときにチェックを行う場合にコンパイルしないことです。 –

+0

@Gavin: 'true 'を返す' compiled_with_g() '関数を使ってソースファイルを作成するとどうなりますか?いくつかのソースファイルを '-g'でコンパイルし、他のソースファイルをコンパイルしない場合、ソースファイルごとにこの関数を生成するルールをmakeファイルに作成するのはどうでしょうか?しかし、プリプロセッサを使うことは、@Vladimirによって提案されていますが、確かに最善の解決策です。 – mszmurlo

答えて

5

あなたの質問に答えてみましょう:はい、現代版の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が含まれている任意のコンパイラオプションの真の引き金となります。私は" -g "を使ってみましたが、このオプションで文字列が始まるか終わりになると問題になります。この2つの特別なケースをif条件に追加することもできます。


あなたはどこにでも#ifdef DEBUGを使用し、(コンパイラに依存)-cppまたは-fppですべてのソースをコンパイルすることができます。


それとも、モジュール

#ifdef DEBUG 
    logical, parameter :: compiled_with_g = .true. 
#else 
    logical, parameter :: compiled_with_g = .false. 
#endif 

でグローバル定数を定義し、-cppまたは-fppでちょうどこのモジュールをコンパイルすることができます。

関数compiledwithg()を使用して同じことを行うことができ、関数内にのみマクロを持つことができます。


それとも、この非常に小さなモジュールの2つのバージョン持つことができます。

module debug_mod 
    logical, parameter :: debug = .true. 
end module 

module debug_mod 
    logical, parameter :: debug = .false. 
end module 

と右のいずれかを使用する(Makefileのような)ビルドシステムを設定します。コンパイラは、パラメータが偽であれば、デッドコードを削除し、マクロと同じくらい効率的です。

関連する問題