Конкатенация расширенного макроса и слова с использованием препроцессора 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 ...

Ответы на вопрос(1)

Ваш ответ на вопрос