Spec-Zone.ru › GNU Fortran 13

6.2.1 Директива ATTRIBUTES

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

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

  • 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 должны быть типа assumed-type (TYPE(*); рекомендуется) или типа INTEGER, LOGICAL, REAL или COMPLEX. Они не должны иметь атрибуты ALLOCATE, CODIMENSION, INTENT(OUT), POINTER или VALUE; кроме того, они должны быть скалярными или иметь размер assumed-size (dimension(*)). Как и TYPE(*), атрибут NO_ARG_CHECK требует явного интерфейса.

  • NO_ARG_CHECK – отключение проверки типа, вида и ранга
  • DEPRECATED – вывод предупреждения при использовании такого тега устаревшей процедуры, переменной или параметра; предупреждение можно подавить с помощью -Wno-deprecated-declarations.
  • NOINLINE – предотвращение встраивания заданной функции.
  • NORETURN – добавление подсказки о том, что заданная функция не может вернуть значение.
  • WEAK – выводить объявление внешнего символа как слабого символа, а не глобального. Это в первую очередь полезно для определения функций библиотеки, которые могут быть переопределены в пользовательском коде, хотя оно также может быть использовано с объявлениями, не являющимися функциями. Переопределяющий символ должен иметь тот же тип, что и слабый символ.

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

!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-13.3.0/gfortran/ATTRIBUTES-directive.html

Spec-Zone.ru

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