あなたの質問に答えてみましょう:はい、現代版の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のような)ビルドシステムを設定します。コンパイラは、パラメータが偽であれば、デッドコードを削除し、マクロと同じくらい効率的です。
多くの場合、プログラムがどのように遵守されたかについての詳細(https://stackoverflow.com/q/46464763/3157076)を得ることができます。 – francescalus
ifdef DEBUGもFortranでも使用できます!プリプロセッサを有効にするだけです。その理由は、それらを使用していないときにチェックを行う場合にコンパイルしないことです。 –
@Gavin: 'true 'を返す' compiled_with_g() '関数を使ってソースファイルを作成するとどうなりますか?いくつかのソースファイルを '-g'でコンパイルし、他のソースファイルをコンパイルしない場合、ソースファイルごとにこの関数を生成するルールをmakeファイルに作成するのはどうでしょうか?しかし、プリプロセッサを使うことは、@Vladimirによって提案されていますが、確かに最善の解決策です。 – mszmurlo