CPP / GPP в макросе с переменным числом фортранов (плюс фортран // конкатенация)

Я пытаюсь скомпилировать огромный, всемирно известный код численного прогноза погоды - написанный в основном на Фортране 90 - который используетCPP широко и успешно, с PGI, Intel и Gfortran. Теперь я унаследовал версию, в которой эксперты добавили несколько сотен случаев макроса с переменным числом аргументов. Они используют Intel иFPP, который, вероятно, немного более ориентирован на Фортран, и может заставить все это работать. Мне нужно использовать Гфортран, и не смог получитьCPP работать над этим кодом с его новыми дополнениями.

Грубое упрощение проблемы заключается в следующем:

Код для предварительной обработки:

    PRINT *, "Hello" // "Don"
#define adderv(...) (myadd(__VA_ARGS__))
    sumv = adderv(1, 2, 3, 4, 5)

С помощьюCPP без-traditional опция будет обрабатывать макрос с переменным числом, но не конкатенацию Фортрана:

$ cpp -P t.F90
    PRINT *, "Hello"
    sumv = (myadd(1, 2, 3, 4, 5))

С другой стороны, используя-traditional flag обрабатывает конкатенацию, но не макрос variadic:

$ cpp -P -traditional t.F90 
t.F90:2:0: error: syntax error in macro parameter list
 #define adderv(...) (myadd(__VA_ARGS__))
 ^
    PRINT *, "Hello" // "Don"
    sumv = adderv(1, 2, 3, 4, 5)

Я действительно изо всех сил пытаюсь найти способ облегчить обработку обоих.

Я начал играть сGPPи чувствую, что я сближаюсь, но реальность такова, что я все еще далеко от решения. Он не принимает... и не расширяется__VA_ARGS__, Конечно, следующее больше не является вариационным макросом ...

    PRINT *, "Hello" // "Don"
#define adderv() (myadd(__VA_ARGS__))
    sumv = adderv(1, 2, 3, 4, 5)



$ gpp t.F90
    PRINT *, "Hello" // "Don"
    sumv = (myadd(__VA_ARGS__))

Я безрезультатно просматривал сеть, и лучшая возможность, которую я до сих пор видел, что кажется мне уродливым и болезненным, - разделить все мои операторы конкатенации на Фортране на отдельные строки. то есть

PRINT *, "Hello" // "Don"

становится

PRINT *, "Hello" /&
&              / "Don"

Внутренности cpp и gpp немного пугают меня, но если кто-то видит потенциал для успеха и может указать мне правильное направление, я был бы очень признателен. Перестройка этого огромного кода на самом деле не вариант, хотя автоматизированная стратегия (например, разделение этих операторов concat на отдельные строки) могла бы быть, если я достаточно отчаянная.

Дополнительная информация - Ройгвиб предложил мне попробовать добавить-C флаг. В последнее время мы подавляли его, потому что он, казалось, вводил много C-комментариев в код Fortran. Ну, я пошел вперед и попробовал это, и я думаю, что я ближе:

$ cat t.f90
        PRINT *, "Hello" // "Don"
    #define adderv(...) (myadd(__VA_ARGS__))
        sumv = adderv(1, 2, 3, 4, 5)

Когда я вызываю с флагами -P и -C, естественно, он проходит через C ++ (оператор Fortran concat), но, похоже, также генерирует некоторый текст с авторскими правами на C-комментариях:

   $ /lib/cpp -P -C  t.F90
   /* Copyright (C) 1991-2014 Free Software Foundation, Inc.
      This file is part of the GNU C Library.
   .
   .
   .
   /* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /       Unicode 6.0.  */
   /* We do not support C11 <threads.h>.  */
       PRINT *, "Hello" // "Don"
       sumv = (myadd(1, 2, 3, 4, 5))

Немного исследований (Удалить комментарии, сгенерированные cpp ) предполагает, что это добавление авторского права может быть относительно новой «функцией» cpp.

Я не вижу никакого простого способа подавить это, поэтому я думаю, что мне может понадобиться создать скрипт-обертку (например,mycpp), который вызывает cpp, как указано выше, отфильтровывает любые комментарии в стиле C, а затем передает их на следующий этап.

Это не оптимально, и я немного осторожен, потому что весь этот пакет также содержит C-код. Тем не менее, теоретически, я думаю, что худшее, что могло бы произойти, это отказ генерировать комментарии в предварительно обработанном C-коде.

Если у кого-то есть знания о том, как я могу просто подавить создание этого сообщения об авторском праве, я могу быть в бизнесе.

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

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