Объединить строки в макрос, используя gfortran

Макрос препроцессора C для конкатенации (##), похоже, не работает на Mac с помощью gfortran. Использование других компиляторов Fortran в других системах работает, поэтому я ищу обходное решение для gfortran. Я должен использовать ## для создания многих переменных, поэтому я не могу обойтись без них.

Пример кода:

#define CONCAT(x,y) x##y
program main
   integer, parameter:: CONCAT(ID,2) = 3
   print*,"Hello", ID_2
end program main

Ошибка компиляции с gfortran по MAC

gfortran m.F90 -o m
m.F90:5.23:
integer, parameter:: ID##2 = 3
                       1
Error: PARAMETER at (1) is missing an initializer

Ответ 1

## не работает в gfortran (любая ОС, а не только Mac), поскольку он запускает CPP в традиционном режиме.

В соответствии с этот поток списка рассылки gfortran правильный оператор в традиционном режиме x/**/y, поэтому вы должны различать разные компиляторы

#ifdef __GFORTRAN__
#define CONCAT(x,y) x/**/y
#else
#define CONCAT(x,y) x ## y
#endif

Другие (http://c-faq.com/cpp/oldpaste.html) используют эту форму, которая ведет себя лучше, когда макрос передается в CONCAT (через Конкатенация расширенного макроса и слова с использованием препроцессора Fortran):

#ifdef __GFORTRAN__
#define PASTE(a) a
#define CONCAT(a,b) PASTE(a)b
#else
#define PASTE(a) a ## b
#define CONCAT(a,b) PASTE(a,b)
#endif

Косвенная формулировка помогает расширить переданный макрос до того, как строки будут объединены (это уже слишком поздно).