macros preprocessor fortran90 gfortran

macros - Fortran 90 con macro de estilo C/C++(p. Ej.#Define SUBNAME(x) s## x)



preprocessor fortran90 (1)

GNU Fortran usa el preprocesador GNU C en modo tradicional , en cuyo modo el operador de macro pegado ## no está disponible. Es por eso que los proyectos de Fortran que se escribieron para compilar también con la cadena de herramientas de GNU realizan preprocesamiento explícito en objetivos adicionales de Makefile, por ejemplo, todos los *.F90 se preprocesan primero con cpp para archivos temporales .f90 que luego se compilan.

Recientemente estoy trabajando con un proyecto de código F90. Estoy usando gfortran (linux y MinGW) para compilarlo. Hay algo interesante en el archivo 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 ...

El archivo loct_inc.F90 se ve así:

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) ...

Creo que en el archivo loct.F90 el autor utilizó conjuntos de macros (estilo C / C ++). Cada conjunto se utiliza para definir un tipo de datos (por ejemplo, real (4), real (8), personaje, etc.). El archivo loct_inc.F90 proporciona un conjunto de funciones que es el mismo excepto el tipo de las variables. Estos dos archivos funcionan juntos como una plantilla de c ++ en mi opinión.

Al final uno debe tener un conjunto de subrutinas:

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

Pero cuando traté de compilar loct.F90 (gfortran -c loct.F90), recibo algunos errores.

basic / loct_inc.F90: 21.13: Incluido en basic / loct.F90: 256:

subrutina s ## loct_pointer_copy_1 (o, i) 1 Error: error de sintaxis en la instrucción SUBROUTINE en (1)

Parece que gfortran reemplazar SUBNAME (loct_pointer_copy_1) (o, i) con s ## loct_pointer_copy_1 (o, i). Pero de acuerdo con la macro c ++, la sustitución correcta debe ser sloct_pointer_copy_1 (o, i).

¿Alguien podría decirme por qué sucedió esto?