+ Added section about forward type declarations

This commit is contained in:
michael 2003-04-23 21:03:17 +00:00
parent c351d2a524
commit f14d6fd872

View File

@ -1406,6 +1406,50 @@ size of the type the pointer points to. In the previous
example \var{P1} will be decremented by 16 bytes, and
\var{P2} will be incremented by 16.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Forward type declarations
\section{Forward type declarations}
Programs often need to maintain a linked list of records. Each record then
contains a pointer to the next record (and possibly to the previous record
as well). For type safety, it is best to define this pointer as a typed
pointer, so the next record can be allocated on the heap using the \var{New}
call. In order to do so, the record should be defined something like this:
\begin{verbatim}
Type
TListItem = Record
Data : Integer;
Next : ^TListItem;
end;
\end{verbatim}
When trying to compile this, the compiler will complain that the
\var{TListItem} type is not yet defined when it encounters the \var{Next}
declaration: This is correct, as the definition is still being parsed.
To be able to have the \var{Next} element as a typed pointer, a 'Forward
type declaration' must be introduced:
\begin{verbatim}
Type
PListItem = ^TListItem;
TListItem = Record
Data : Integer;
Next : PTListItem;
end;
\end{verbatim}
When the compiler encounters a typed pointer declaration where the
referenced type is not yet known, it postpones resolving the reference later
on: The pointer definition is a 'Forward type declaration'. The referenced
type should be introduced later in the same \var{Type} block. No other block
may come between the definition of the pointer type and the referenced type.
Indeed, even the word \var{Type} itself may not re-appear: in effect it
would start a new type-block, causing the compiler to resolve all pending
declarations in the current block. In most cases, the definition of the
referenced type will follow immediatly after the definition of the pointer
type, as shown in the above listing. The forward defined type can be used in
any type definition following its declaration.
Note that a forward type declaration is only possible with pointer types and
classes, not with other types.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Procedural types
\section{Procedural types}