Ниже я объясню, используя полный пример ниже (который вы можете скомпилировать и связать, чтобы попробовать что-то):
module mymodule
contains
integer function foo ()
foo = 1
end function
integer function bar ()
integer :: foo
bar = foo()
end function
end module
program test
use mymodule
print *, bar()
end
В коде функции bar
объявление integer :: foo
строго эквивалентно:
integer, external :: foo
Таким образом, в коде bar
вы явно указываете:
"там уже может быть символ имени
foo
доступно для вас, но отныне
когда я использую это, я имею в виду, чтобы быть
внешняя функция с таким названием "
Итак, это допустимый код, и компилятор ожидает, что вы предоставите функцию external
с именем foo
. Поскольку вы этого не делаете (функция модуля не является внешней), он не может связать. Вы можете предоставить внешнюю функцию foo
, добавив следующий код (не в модуле, просто в конце того же файла):
integer function foo ()
foo = 42
end function
Если вы добавите это тело функции, то ваш код скомпилируется, и результат будет 42
(так как вызывается внешняя функция, а не функция модуля).
Также стоит отметить, что если вы закомментируете строку integer :: foo
в коде bar
, символ foo
будет преобразован в функцию модуля, которая будет вызываться независимо от того, предоставляете ли вы внешнюю функцию с именем foo
(таким образом, вывод будет 1
).
Вывод: не ошибка компилятора, а неправильное использование старой функции языка (внешние объявления). Если честно, я думаю, что лучше пометить ваши external
декларации как таковые, что, по крайней мере, выделило бы проблему здесь.