Concatenando una macro expandida y una palabra usando el preprocesador Fortran

Estoy tratando de concatenar una palabra en el código fuente con la expansión de una macro de preprocesador. Básicamente tengofoo en algún lugar del código y con un#define EXPANSION bar Quiero obtenerfoobar. Sin embargo, estoy luchando por encontrar una manera de hacer esto, que funciona con todos los compiladores. Por el momento, sería feliz si funciona con gfortran y ifort.

De acuerdo a sudocumentación, el preprocesador gfortran es un preprocesador C que se ejecuta en "modo tradicional", que no tiene el## operador token paste. Sin embargo, se puede obtener el mismo efecto con un estilo C vacío/**/ comentario. El preprocesador de ifort parece comportarse más como el preprocesador de C normal, por lo que el pegado de tokens normal hace el truco en ifort. Lamentablemente el vacio/**/ el comentario no funciona en ifort, ya que el comentario se reemplaza por un solo espacio en su lugar.

Aquí hay un pequeño ejemplo:

#define EXPANSION bar
#define CAT(x,y) PASTE(x,y)
#define PASTE(x,y) x ## y

foo/**/EXPANSION   
CAT(foo,EXPANSION)

Para lo cual produce gfortran:

foobar
foo ## bar

Mientras que ifort me da:

foo bar
foobar

Por supuesto, podría elegir la forma correcta comprobando las macros predefinidas para ambos compiladores:

#ifdef __GFORTRAN__
foo/**/EXPANSION
#else
CAT(foo,EXPANSION)
#endif

Esto funciona para ambos, pero es bastante feo tener el preprocesador condicional para cada expansión. Preferiría evitar esto y tener un poco de macro magia solo una vez al principio.

he vistoesta respuesta a otra pregunta, que probablemente me permitiría solucionar este problema, pero preferiría encontrar una solución que no invoque el preprocesador por separado.

No estoy muy familiarizado con el preprocesador C. Tal vez hay una manera simple de hacer lo que quiero. ¿Algunas ideas?

EDITAR: Ya he intentado algo como esto:

#define EXPANSION bar
#define CAT(x,y) PASTE(x,y)
#ifdef __GFORTRAN__
#define PASTE(x,y) x/**/y
#else
#define PASTE(x,y) x ## y
#endif

CAT(foo,EXPANSION)

Desafortunadamente esto no funciona en gfortran donde producefooEXPANSION. No estoy completamente seguro de cómo funciona esto, pero aparentemente la expansión de laCAT macro impide la expansión deEXPANSION en la misma linea. Sospecho que esta es una característica del preprocesador C "tradicional" ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta