6.2.1 Директива ATTRIBUTES
Стандарт Fortran описывает поведение совместимой программы; однако, точное исполнение не стандартизовано. Для того, чтобы позволить пользователю выбирать конкретные детали реализации, можно использовать директивы компилятора для установки атрибутов переменных и процедур, которые не являются частью стандарта. Поддерживается ли данный атрибут и его точное воздействие зависят как от операционной системы, так и от процессора; см. Расширения C в руководстве по использованию GNU компилятора (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 должны быть типа с предполагаемым типом (TYPE(*); рекомендуется) или типа INTEGER, LOGICAL, REAL или COMPLEX. Они не должны иметь атрибуты ALLOCATE, CODIMENSION, INTENT(OUT), POINTER или VALUE; кроме того, они должны быть скалярными или с предполагаемым размером (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-14.2.0/gfortran/ATTRIBUTES-directive.html