最近、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) である必要があります。
なぜこれが起こったのか誰か教えてもらえますか?