7.4.2 Схемы передачи аргументов
Подпрограммы не возвращают значения (что соответствует C99’s void) в то время как функции либо возвращают значение, как указано в платформенном ABI, либо переменная результата передается как скрытый аргумент функции, и результат не возвращается. Скрытая переменная результата используется, когда переменная результата является массивом или типа CHARACTER.
Аргументы передаются в соответствии с платформенным ABI. В частности, сложные аргументы могут не быть совместимы со структурой с двумя вещественными компонентами для вещественной и мнимой части. Передача аргументов соответствует схеме C99’s _Complex. Функции со скалярными комплексными переменными результата возвращают их значение и не используют аргумент по ссылке. Обратите внимание, что с опцией -ff2c передача аргументов изменяется и больше не полностью соответствует платформенному ABI. Некоторые другие компиляторы Fortran используют f2c семантику по умолчанию; это может вызвать проблемы с взаимозаменяемостью.
GNU Fortran передает большинство аргументов по ссылке, т. е. передавая указатель на данные. Обратите внимание, что компилятор может использовать временную переменную, в которую был скопирован фактический аргумент, если это семантически необходимо (копирование-вход/копирование-выход).
Для аргументов с атрибутом ALLOCATABLE и POINTER (включая указатели на процедуры) передается указатель на указатель, чтобы адрес указателя можно было изменить в процедуре.
Для псевдоаргументов с атрибутом VALUE: скалярные аргументы типа INTEGER, LOGICAL, REAL и COMPLEX передаются по значению в соответствии с ABI платформы. (В качестве расширения поставщика и не рекомендуется, использование %VAL() в вызове процедуры имеет тот же эффект.) Для TYPE(C_PTR) и указателей на процедуры передается сам указатель, чтобы он мог быть изменен без влияния на вызывающую сторону.
Для аргументов типа булево (LOGICAL) обратите внимание, что GCC ожидает только целые значения 0 и 1. Если переменная GNU Fortran LOGICAL содержит другое целое значение, результат не определен. Поскольку некоторые другие компиляторы Fortran используют -1 для .TRUE., необходимо проявлять особую осторожность — например, передавая значение как INTEGER. (Такое же ограничение по значениям также применяется к другим фронтендам GCC, например, к компилятору C99 GCC для _Bool или компилятору Ada GCC для Boolean).
Для аргументов типа CHARACTER длина символьной строки передается как скрытый аргумент в конце списка аргументов. Для строк с переменной длиной значение передается по ссылке, в противном случае по значению. Длина символьной строки имеет тип C size_t (или INTEGER(kind=C_SIZE_T) в Fortran). Обратите внимание, что это отличается от более ранних версий компилятора GNU Fortran, где тип скрытого аргумента длины символьной строки был типом C int. Чтобы сохранить совместимость со старыми версиями, например, для следующей Fortran-процедуры
subroutine fstrlen (s, a) character(len=*) :: s integer :: a print*, len(s) end subroutine fstrlen
можно определить соответствующий прототип C следующим образом:
#if __GNUC__ > 7 typedef size_t fortran_charlen_t; #else typedef int fortran_charlen_t; #endif void fstrlen_ (char*, int*, fortran_charlen_t);
Чтобы избежать подобных деталей, специфичных для компилятора, для нового кода рекомендуется использовать функцию ISO_C_BINDING.
Обратите внимание, что при связывании с C CHARACTER(len=1) переменные результата возвращаются в соответствии с ABI платформы, и для псевдоаргументов не используется скрытый аргумент длины; при VALUE, эти переменные передаются по значению.
Для OPTIONAL псевдоаргументов отсутствующий аргумент обозначается указателем NULL, за исключением скалярных псевдоаргументов типа INTEGER, LOGICAL, REAL и COMPLEX, которые имеют атрибут VALUE. Для них используется скрытый булев аргумент (logical(kind=C_bool),value) для указания наличия аргумента.
Аргументы, которые являются массивами с предположительной формой, предположительным рангом или переменным рангом, или, с -fcoarray=lib, аллокабельными скалярными комассивами, используют описатель массива. Все остальные массивы передают адрес первого элемента массива. При -fcoarray=lib токен и смещение, относящиеся к псевдоаргументам неаллокабельных комассивов, передаются как скрытый аргумент вместе со скрытыми аргументами длины символьной строки. Токен — это неявный указатель, идентифицирующий комассив, а смещение — целое число, передаваемое по значению, вида C_PTRDIFF_T, обозначающее байтовое смещение между базовым адресом комассива и передаваемым скаляром или первым элементом передаваемого массива.
Аргументы передаются в следующем порядке
- Переменная результата, когда результат функции передается по ссылке
- Длина символьной строки результата функции, если она имеет тип
CHARACTERи не используется связывание с C - Аргументы в порядке их появления в объявлении Fortran
- Статус наличия для необязательных аргументов с атрибутом значения, которые передаются по значению
- Длина символьной строки и/или токен и смещение комассива для первого аргумента, являющегося
CHARACTERили неаллокабельным псевдоаргументом комассива, за которым следуют скрытые аргументы следующего псевдоаргумента такого типа
Предыдущий: Правила именования, Верхний уровень: Правила именования и передачи аргументов [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gfortran/Argument-passing-conventions.html