Fortran 90 cu macrocomandă stil C/C ++ (de ex. # Define SUBNAME (x) s ## x)

Lucrez recent cu un proiect de cod F90. Folosesc gfortran (linux și MinGW) pentru al compila. Există ceva interesant în fișierul 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
...

Fișierul loct_inc.F90 arată astfel:

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)


...

Cred că în fișierul loct.F90 autorul a folosit seturi de macrocomenzi (stil C/C ++). Fiecare set este utilizat pentru a defini un tip de date (de exemplu, real (4), real (8), caracter etc.). Fișierul loct_inc.F90 oferă un set de funcții care este același cu excepția tipului de variabile. Aceste două fișiere funcționează împreună ca șablon de C ++ în opinia mea.

În final, ar trebui să existe un set de subrutine:

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

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

Dar când am încercat să compilesc loct.F90 (gfortran -c loct.F90), am câteva erori.

bază/loct_inc.F90: 21.13:       Inclus la baza/loct.F90: 256:

     

subrutina s ## loct_pointer_copy_1 (o, i)                1 Eroare: Eroare de sintaxă din instrucțiunea SUBROUTINE la (1)

Se pare că gfortran înlocuiește SUBNAME (loct_pointer_copy_1) (o, i) cu s ## loct_pointer_copy_1 (o, i). Dar, în funcție de macrocomanda c ++, înlocuirea corectă ar trebui să fie sloct_pointer_copy_1 (o, i).

Poate cineva să-mi spună de ce sa întâmplat asta?

0

1 răspunsuri

GNU Fortran folosește GNU C Preprocessor în mod tradițional , în care mod nu este disponibil operatorul de lipire macro ## . De aceea, proiectele Fortran care au fost scrise pentru a compila și cu uneltele de instrumente GNU efectuează o preprocesare explicită în alte ținte Makefile suplimentare, de ex. toate *. F90 sunt inițial preprocesate cu cpp la fișierele temporare .f90 care sunt apoi compilate.

0
adăugat
Mulțumesc mult lui Hristo. Voi precompune mai întâi fișierele F90. Voi căuta o vreme pentru a vedea dacă găsesc un răspuns.
adăugat autor FortCpp, sursa