2.3 Включение и настройка предварительной обработки
Многие компиляторы Fortran, включая GNU Fortran, позволяют передавать исходный код через препроцессор C (CPP; иногда также называемый препроцессором Fortran, FPP), что позволяет использовать условную компиляцию. В случае GNU Fortran это GNU C Препроцессор в традиционном режиме. В системах с сохранением регистра в именах файлов препроцессор автоматически вызывается, если расширение файла — .F, .FOR, .FTN, .fpp, .FPP, .F90, .F95, .F03 или .F08. Чтобы вручную вызвать препроцессор для любого файла, используйте -cpp, чтобы отключить предварительную обработку файлов, для которых препроцессор запускается автоматически, используйте -nocpp.
Если преобразованный файл включает другой файл с оператором Fortran INCLUDE, включённый файл не обрабатывается препроцессором. Для обработки включенных файлов используйте эквивалентную инструкцию препроцессора #include.
Если GNU Fortran вызывает препроцессор, __GFORTRAN__ определено. Макросы __GNUC__, __GNUC_MINOR__ и __GNUC_PATCHLEVEL__ могут использоваться для определения версии компилятора. См. Обзор в Препроцессоре C для получения подробностей.
GNU Fortran поддерживает ряд INTEGER и REAL типов kind помимо типов kind, требуемых стандартом Fortran. Доступность любого заданного типа kind зависит от архитектуры. Для условного включения кода для этих дополнительных типов kind можно использовать следующие предопределённые макросы препроцессора: __GFC_INT_1__, __GFC_INT_2__, __GFC_INT_8__, __GFC_INT_16__, __GFC_REAL_10__, и __GFC_REAL_16__.
Хотя CPP является фактическим стандартом для предварительной обработки кода Fortran, часть 3 стандарта Fortran 95 (ISO/IEC 1539-3:1998) определяет условную компиляцию, которая не широко используется и не поддерживается напрямую компилятором GNU Fortran. Вы можете использовать программу coco для предварительной обработки таких файлов (http://www.daniellnagle.com/coco.html).
Следующие параметры управляют предварительной обработкой кода Fortran:
-cpp-nocpp-
Включить предварительную обработку. Предварительная обработка автоматически вызывается, если расширение файла равно .fpp, .FPP, .F, .FOR, .FTN, .F90, .F95, .F03 или .F08. Используйте этот параметр для ручного включения предварительной обработки любого типа файла Fortran.
Для отключения предварительной обработки файлов с любым из перечисленных выше расширений используйте отрицательную форму: -nocpp.
Предварительная обработка выполняется в традиционном режиме. Любые ограничения формата файла, особенно ограничения на длину строки, также применяются к выходным данным предварительной обработки, поэтому рекомендуется использовать параметры -ffree-line-length-none или -ffixed-line-length-none.
-dM-
Вместо обычного вывода сгенерировать список директив
'#define'для всех макросов, определённых во время выполнения предварительной обработки, включая предопределённые макросы. Это даст вам способ узнать, что предопределено в вашей версии предварительной обработки. Предполагая, что у вас нет файла foo.f90, командаtouch foo.f90; gfortran -cpp -E -dM foo.f90
отобразит все предопределённые макросы.
-dD-
Как -dM, за исключением двух аспектов: он не включает предопределённые макросы, и он выводит как директивы
#define, так и результат предварительной обработки. Оба вида вывода направляются в стандартный выходной файл. -dN-
Как -dD, но выводит только имена макросов, а не их расширения.
-dU-
Как -dD, за исключением того, что выводятся только те макросы, которые были расширены или чьё определение проверялось в директивах предварительной обработки; вывод откладывается до использования или проверки макроса; и директивы
'#undef'также выводятся для макросов, проверенных, но неопределённых на момент вывода. -dI-
Вывод директив
'#include'в дополнение к результату предварительной обработки. -fworking-directory-
Включить генерацию маркеров строк в выводе предварительной обработки, которые позволят компилятору узнать текущую рабочую директорию на момент предварительной обработки. При включении этого параметра предварительная обработка будет генерировать после начального маркера строки ещё один маркер строки с текущей рабочей директорией, за которым следуют две косые черты. GCC будет использовать эту директорию, если она присутствует в преобразованном вводе, как директорию, указанную в качестве текущей рабочей директории в некоторых форматах отладки. Этот параметр неявно включён, если включена информация об отладке, но это можно отключить с помощью отрицательной формы -fno-working-directory. Если флаг -P присутствует в командной строке, этот параметр не имеет эффекта, поскольку директивы
#lineне генерируются вообще. -idirafter dir-
Искать файлы включения в dir, но делать это после того, как были исчерпаны все директории, указанные с помощью -I, и стандартные системные директории. dir обрабатывается как системная директория включения. Если dir начинается с
=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -imultilib dir-
Использовать dir в качестве подкаталога каталога, содержащего целевые заголовки C++.
-iprefix prefix-
Указать prefix в качестве префикса для последующих параметров -iwithprefix. Если prefix представляет каталог, вы должны включить конечный
'/'. -isysroot dir-
Этот параметр аналогичен параметру --sysroot, но применяется только к файлам заголовков. Для получения дополнительной информации см. параметр --sysroot.
-iquote dir-
Искать dir только для файлов заголовков, запрошенных с помощью
#include "file"; они не ищутся для#include <file>, перед всеми каталогами, указанными параметром -I, и перед стандартными системными каталогами. Если dir начинается с=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -isystem dir-
Искать в dir файлы заголовков после всех каталогов, указанных с помощью -I, но перед стандартными системными каталогами. Отметить его как системную директорию, чтобы он получил такое же специальное обращение, как и стандартные системные директории. Если dir начинается с
=, то=будет заменено префиксом sysroot; см. --sysroot и -isysroot. -nostdinc-
Не искать стандартные системные директории для файлов заголовков. Ищутся только директории, указанные вами с параметром -I (и директория текущего файла, если это уместно).
-undef-
Не определять какие-либо системные или специфичные для GCC макросы. Стандартные предопределённые макросы остаются определёнными.
-Apredicate=answer-
Сделать утверждение с предикатом predicate и ответом answer. Эта форма предпочтительнее старой формы -A predicate(answer), которая всё ещё поддерживается, потому что не использует специальные символы оболочки.
-A-predicate=answer-
Отменить утверждение с предикатом predicate и ответом answer.
-C-
Не отбрасывать комментарии. Все комментарии передаются в выходной файл, за исключением комментариев в обработанных директивах, которые удаляются вместе с директивой.
Вы должны быть готовы к побочным эффектам при использовании -C; это заставляет предварительную обработку обрабатывать комментарии как токены самостоятельно. Например, комментарии, появляющиеся в начале строки, которая должна быть директивой, имеют эффект превращения этой строки в обычную строку исходного кода, поскольку первый токен в строке больше не является
'#'.Предупреждение: в настоящее время поддерживаются только комментарии в стиле C. Предварительная обработка пока не распознаёт комментарии в стиле Fortran.
-CC-
Не отбрасывать комментарии, включая при расширении макроса. Это похоже на -C, за исключением того, что комментарии, содержащиеся в макросах, также передаются в выходной файл, где макрос расширяется.
В дополнение к побочным эффектам параметра -C, параметр -CC заставляет все комментарии в стиле C++ внутри макроса преобразовываться в комментарии в стиле C. Это для предотвращения случайного комментирования остальной части строки исходного кода при последующем использовании этого макроса. Параметр -CC обычно используется для поддержки комментариев lint.
Предупреждение: в настоящее время поддерживаются только комментарии в стиле C и C++. Предварительная обработка пока не распознаёт комментарии в стиле Fortran.
-Dname-
Предопределить имя как макрос с определением
1. -Dname=definition-
Содержимое definition токенизируется и обрабатывается так, как если бы оно появилось во время этапа перевода три в директиве
'#define'. В частности, определение будет усечено встроенными символами новой строки.Если вы вызываете предварительную обработку из оболочки или оболочеподобной программы, вам может потребоваться использовать синтаксис цитирования оболочки для защиты символов, таких как пробелы, которые имеют значение в синтаксисе оболочки.
Если вы хотите определить макрос в стиле функции в командной строке, запишите его список аргументов в круглых скобках перед знаком равенства (если есть). Скобки имеют значение для большинства оболочек, поэтому вам нужно процитировать параметр. С оболочками sh и csh,
-D'name(args...)=definition'работает.Параметры -D и -U обрабатываются в порядке их указания в командной строке. Все параметры -imacros и -include обрабатываются после всех параметров -D и -U.
-H-
Вывести имя каждого используемого файла заголовка в дополнение к другим обычным действиям. Каждое имя отступено, чтобы показать, насколько глубоко оно находится в стеке
'#include'. -P-
Запретить генерацию маркеров строк в выводе предварительной обработки. Это может быть полезно, когда предварительная обработка выполняется над чем-то, что не является кодом C, и будет отправлено программе, которая может быть сбита с толку маркерами строк.
-Uname-
Отменить любое предыдущее определение name, встроенное или предоставленное с помощью параметра -D.
Далее: Параметры ошибок и предупреждений, Предыдущее: Параметры диалекта Fortran, Наверх: Вызов GNU Fortran [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gfortran/Preprocessing-Options.html