Further to Steve's reply, we have already noted the need to revise this, and I add below the text of Section 19.9 on p. 375 of MFE as it will appear in the latest reprinting. Note also Section 21.9.2.
Regards,
Mike
A Fortran procedure is interoperable if it has an explicit interface
and is declared with the {bind} attribute:
function func(i, j, k, l, m) bind(c)
subroutine subr () bind(c)
Note that even for a subroutine with no arguments the parentheses are
required.
Each dummy argument must be interoperable and neither optional
nor an array with the {value} attribute.
For a function, the result must be scalar and interoperable.
The procedure usually has a {binding label}, which has global scope
and is the name by which it is known to
the C processor.{footnote[...]}
By default, it is the lower-case version of the
Fortran name. For example, the function in the previous paragraph
has the binding label {func}. An alternative binding label may be specified
for an external or module procedure:
function func(i, j, k, l, m) bind(c, name='c_func')
but this is not permitted for an abstract interface, dummy procedure,
or internal procedure.
The value following the {name=} must be a scalar default character
constant expression. Unless this expression has zero length or is all blanks,
the binding label is the result of discarding all its leading and trailing
blanks. The case is significant.