1

最近、F90 コード プロジェクトに取り組んでいます。gfortran (Linux および MinGW) を使用してコンパイルしています。ファイル loct.F90 には興味深いものがあります。

#  define TYPE real(4)
#  define SUBNAME(x) s ## x
#  include "loct_inc.F90"
#  undef SUBNAME
#  undef TYPE

#  define TYPE real(8)
#  define SUBNAME(x) d ## x
#  include "loct_inc.F90"
#  undef SUBNAME
#  undef TYPE
...

loct_inc.F90 ファイルは次のようになります。

subroutine SUBNAME(loct_pointer_copy_1)(o, i)
...
end subroutine SUBNAME(loct_pointer_copy_1)


subroutine SUBNAME(loct_pointer_copy_2)(o, i)
...
end subroutine SUBNAME(loct_pointer_copy_2)


...

ファイル loct.F90 で、作成者が一連のマクロ (C/C++ スタイル) を使用したと思います。各セットは、データ型 (real(4)、real(8)、文字など) を定義するために使用されます。ファイル loct_inc.F90 は、変数の型を除いて同じ関数のセットを提供します。私の意見では、これらの 2 つのファイルは C++ のテンプレートとして連携します。

最後に、一連のサブルーチンが必要です。

sloct_pointer_copy_1(o, i)
sloct_pointer_copy_2(o, i)
...

dloct_pointer_copy_1(o, i)
dloct_pointer_copy_2(o, i)
...

しかし、loct.F90 (gfortran -c loct.F90) をコンパイルしようとすると、エラーが発生します。

basic/loct_inc.F90:21.13: basic/loct.F90:256 に含まれる:

subroutine s ## loct_pointer_copy_1(o, i) 1 エラー: (1) の SUBROUTINE ステートメントの構文エラー

gfortran は SUBNAME(loct_pointer_copy_1)(o, i) を s ## loct_pointer_copy_1(o, i) に置き換えているようです。しかし、C++ マクロによると、正しい置換は sloct_pointer_copy_1(o, i) である必要があります。

なぜこれが起こったのか誰か教えてもらえますか?

4

1 に答える 1

2

GNU Fortran は GNU C プリプロセッサを従来のモードで使用します。このモードでは、マクロ貼り付け演算子##は使用できません。そのため、GNU ツールチェーンでコンパイルするように作成された Fortran プロジェクトは、追加の Makefile ターゲットで明示的な前処理を実行します。たとえば、すべて*.F90が最初cppに一時.f90ファイルで前処理され、その後コンパイルされます。

于 2012-06-03T09:07:07.033 に答える