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