Spec-Zone.ru › GNU Fortran 4

7.2 Директивы компилятора GNU Fortran

Стандарт Fortran описывает, как должен вести себя соответствующий программа; однако точная реализация не стандартизирована. Для того, чтобы позволить пользователю выбирать конкретные детали реализации, можно использовать директивы компилятора для установки атрибутов переменных и процедур, которые не являются частью стандарта. Поддержка данного атрибута и его точное влияние зависят как от операционной системы, так и от процессора; см. Расширения C для получения подробной информации.

Для процедур и указателей на процедуры можно использовать следующие атрибуты для изменения соглашения о вызовах:

  • CDECL – стандартное соглашение о вызовах C
  • STDCALL – соглашение, при котором вызываемая процедура очищает стек
  • FASTCALL – часть аргументов передается через регистры вместо использования стека

Помимо изменения соглашения о вызовах, атрибуты также влияют на оформление имени символа, например, с помощью ведущего подчеркивания или с помощью заключительного знака @, за которым следует количество байтов в стеке. При присваивании процедуры указателю на процедуру оба должны использовать одинаковое соглашение о вызовах.

В некоторых системах процедурам и глобальным переменным (переменным модуля и COMMON блокам) требуется специальная обработка для доступа к ним при нахождении в общей библиотеке. Доступны следующие атрибуты:

  • DLLEXPORT – предоставление глобального указателя на указатель в DLL
  • DLLIMPORT – ссылка на функцию или переменную с использованием глобального указателя

Для аргументов-фиктивных значений атрибут NO_ARG_CHECK может быть использован; в других компиляторах он также известен как IGNORE_TKR. Для аргументов-фиктивных значений с этим атрибутом принимаются фактические аргументы любого типа и рода (аналогично TYPE(*)), скаляры и массивы любого ранга (нет эквивалента в стандарте Fortran). Как и с TYPE(*), аргумент является неограниченно полиморфным, и информация о типе недоступна. Кроме того, аргумент может быть передан только аргументам-фиктивным значениям с атрибутом NO_ARG_CHECK и в качестве аргумента функции PRESENT и к C_LOC модуля ISO_C_BINDING.

Переменные с атрибутом NO_ARG_CHECK должны быть типа с предполагаемым типом (TYPE(*); рекомендуется) или типа INTEGER, LOGICAL, REAL или COMPLEX. Они не должны иметь атрибуты ALLOCATE, CODIMENSION, INTENT(OUT), POINTER или VALUE; кроме того, они должны быть скалярными или иметь размер, определяемый в коде (dimension(*)). Как и TYPE(*), атрибут NO_ARG_CHECK требует явного интерфейса.

  • NO_ARG_CHECK – отключение проверки типа, рода и ранга

Атрибуты указываются с помощью синтаксиса

!GCC$ ATTRIBUTES список_атрибутов :: список_переменных

где в коде в свободном формате до !GCC$ допускаются только пробелы, а в коде с фиксированной формой !GCC$, cGCC$ или *GCC$ должны начинаться с первой колонки.

Для процедур директивы компилятора должны быть размещены в теле процедуры; для переменных и указателей на процедуры они должны быть в той же части объявления, что и переменная или указатель на процедуру.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gfortran/GNU-Fortran-Compiler-Directives.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API