Ответ 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
Косвенная формулировка помогает расширить переданный макрос до того, как строки будут объединены (это уже слишком поздно).