최근에 F90 코드 프로젝트로 작업하고 있습니다. 나는 그것을 컴파일하기 위해 gfortran (리눅스와 MinGW)을 사용하고있다. loct.F90 파일에는 흥미로운 것이 있습니다.C/C++ 스타일 매크로가있는 Fortran 90 (예 : # define SUBNAME (x) s ## x)
# 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)
...
내가 파일에 생각이 저자가 매크로 (C/C++ 스타일)의 세트를 사용 loct.F90. 각 세트는 데이터 유형 (예 : real (4), real (8), character 등)을 정의하는 데 사용됩니다. loct_inc.F90 파일은 변수의 유형을 제외하고는 동일한 함수 세트를 제공합니다. 이 두 파일은 내 의견으로는 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: Included at basic/loct.F90:256:
subroutine s ## loct_pointer_copy_1(o, i) 1 Error: Syntax error in SUBROUTINE statement at (1)
그것은 SUBNAME (loct_pointer_copy_1를) 대체 gfortran 것 (O, I)과의 ## loct_pointer_copy_1 (오, 난). 그러나 C++ 매크로에 따르면 올바른 교체는 sloct_pointer_copy_1 (o, i)이어야합니다.
왜 이런 일이 일어 났는지 말해 줄 수 있습니까?
고마워요. Hristo. 먼저 f90 파일을 전처리합니다. 나는 대답을 찾을 수 있는지 잠시 동안 찾아 볼 것이다. – FortCpp