7.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 должны быть типа с предположением типа (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$ должны начинаться с первой колонки.
Для процедур директивы компилятора должны быть помещены в тело процедуры; для переменных и указателей на процедуры — в той же части объявления, что и переменная или указатель на процедуру.
Далее: Директива UNROLL, Наверх: Директивы компилятора GNU Fortran [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gfortran/ATTRIBUTES-directive.html