Statement and Attribute: Allows an external procedure, a dummy procedure, a procedure pointer, or a block data subprogram to be used as an actual argument. (To specify intrinsic procedures as actual arguments, use the INTRINSIC attribute.)
The EXTERNAL attribute can be specified in a type declaration statement or an EXTERNAL statement, and takes one of the following forms:
Type Declaration Statement:
type,[att-ls,] EXTERNAL [, att-ls] :: ex-pro[, ex-pro]...
EXTERNAL [::] ex-pro[, ex-pro] ...
Is a data type specifier.
Is an optional list of attribute specifiers.
Is the name of an external (user-supplied) procedure, a dummy procedure, a procedure pointer, or block data subprogram.
In a type declaration statement, only functions can be declared EXTERNAL. However, you can use the EXTERNAL statement to declare subroutines and block data program units, as well as functions, to be external.
The name declared EXTERNAL is assumed to be the name of an external procedure, even if the name is the same as that of an intrinsic procedure. For example, if SIN is declared with the EXTERNAL attribute, all subsequent references to SIN are to a user-supplied function named SIN, not to the intrinsic function of the same name.
You can include the name of a block data program unit in the EXTERNAL statement to force a search of the object module libraries for the block data program unit at link time. However, the name of the block data program unit must not be used in a type declaration statement.
If you want to describe a routine with greater detail, use the INTERFACE statement. This statement automatically declares a routine as EXTERNAL, and provides information on result types and argument types.
A procedure that has both the EXTERNAL and POINTER attributes is a procedure pointer.
The following example shows type declaration statements specifying the EXTERNAL attribute:
INTEGER, EXTERNAL :: BETA
LOGICAL, EXTERNAL :: COS
CALL SUB(BETA) ! External function BETA is an actual argument
You can use a name specified in an EXTERNAL statement as an actual argument to a subprogram, and the subprogram can then use the corresponding dummy argument in a function reference or a CALL statement; for example:
Used as an argument, a complete function reference represents a value, not a subprogram; for example, FUNC(B) represents a value in the following statement:
CALL SUBR(A, FUNC(B), C)
The following shows another example:
EXTERNAL MyFunc, MySub
C MyFunc and MySub are arguments to Calc
CALL Calc (MyFunc, MySub)
C Example of a user-defined function replacing an
x = SIN (a, 4.2, 37)