2012-06-02 3 views
0

최근에 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)이어야합니다.

왜 이런 일이 일어 났는지 말해 줄 수 있습니까?

답변

1

GNU 포트란 매크로 붙여 넣기 연산자 ## 사용할 수없는 어떤 모드에서 전통적인 모드,의 GNU C 전 처리기를 사용합니다. 이것이 GNU 툴체인으로 컴파일되도록 작성된 Fortran 프로젝트가 추가 Makefile 타겟에서 명시 적 사전 처리를 수행하는 이유입니다. 모두 *.F90cpp으로 임시 처리되어 .f90 개의 파일로 사전 처리되며 컴파일됩니다.

+0

고마워요. Hristo. 먼저 f90 파일을 전처리합니다. 나는 대답을 찾을 수 있는지 잠시 동안 찾아 볼 것이다. – FortCpp