Конкатенация расширенного макроса и слова с использованием препроцессора Fortran
Я пытаюсь объединить слово в исходном коде с расширением макроса препроцессора. В основном у меняfoo
где-то в коде, и с#define EXPANSION bar
Я хочу получитьfoobar
, Тем не менее, я изо всех сил пытаюсь найти способ сделать это, который работает со всеми компиляторами. На данный момент я был бы счастлив, если бы он работал с gfortran и ifort.
Согласно егодокументацияпрепроцессор gfortran - это препроцессор C, работающий в «традиционном режиме», который не имеет##
оператор токеновой пасты. Тем не менее, тот же эффект может быть получен с пустым C-стилем/**/
комментарий. Кажется, что препроцессор ifort ведет себя больше, чем обычный препроцессор C, поэтому обычное вставление токенов помогает в ifort. К сожалению пустой/**/
комментарий не работает в ifort, так как комментарий заменяется одним пробелом.
Вот небольшой пример:
#define EXPANSION bar
#define CAT(x,y) PASTE(x,y)
#define PASTE(x,y) x ## y
foo/**/EXPANSION
CAT(foo,EXPANSION)
Для которого Гфортран производит:
foobar
foo ## bar
Пока ifort дает мне:
foo bar
foobar
Конечно, я мог бы выбрать правильный путь, проверив предопределенные макросы для обоих компиляторов:
#ifdef __GFORTRAN__
foo/**/EXPANSION
#else
CAT(foo,EXPANSION)
#endif
Это работает для них обоих, но довольно уродливо иметь условный препроцессор для каждого расширения. Я бы предпочел избежать этого и иметь немного магии магии только один раз в начале.
я виделэтот ответ на другой вопрос, который, вероятно, позволил бы мне обойти эту проблему, но я бы скорее нашел решение, которое не вызывает препроцессор отдельно.
Я не слишком знаком с препроцессором Си. Может быть, есть простой способ сделать то, что я хочу. Есть идеи?
РЕДАКТИРОВАТЬ: Я уже пробовал что-то вроде этого:
#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)
К сожалению, это не работает в Gfortran, где он производитfooEXPANSION
, Я не совсем уверен, как это работает, но, видимо, расширениеCAT
макрос предотвращает расширениеEXPANSION
в той же строке. Я подозреваю, что это особенность "традиционного" препроцессора C ...