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-коде.
Если у кого-то есть знания о том, как я могу просто подавить создание этого сообщения об авторском праве, я могу быть в бизнесе.