CONCEPT
VARIABLE INITIALIZATION
DESCRIPTION
Global variables, like their local counterparts, can be defined
with an initial value:
int * a = ({ 3, 4 });
The initialization value can be any legal LPC expression,
including function calls. The code for the initializations is
collected in a compiler-generated function __INIT() which is
called even before the create-hook is applied on the object.
During initialization, blueprints and clones are treated
slightly differently:
Blueprint variables are always all initialized using __INIT().
For clones the programmer can select whether the clone's
variables should also be initialized with __INIT(), or if they
should be assigned from the current blueprint values
('shared with the blueprint'). The latter method is useful for
example if blueprints and clones shall share arrays or
mappings.
The selection is performed with the two pragmas
'init_variables' and 'share_variables'. The status of this
pragma at the point of the first variable definition counts,
and is applied to all variables in the program.
The clone initialization method is evaluated per-program, i.e.
if an inherited program defines 'share_variables' and the child
program doesn't, only the inherited variables are initialized
from the blueprint, and all others from __INIT().
The default setting for the pragma is configured into the
driver, but can also be chosen when starting the driver.
EXAMPLE
For the object
----------
inherit "a";
int a = 4;
int b;
----------
the compiler executes the equivalent of these __INIT() functions:
#pragma share_variables:
unknown __INIT()
{
"a"::__INIT();
if (clonep(this_object()))
{
a = (blueprint of this_object())->a;
}
else
{
a = 4;
}
return 1;
}
#pragma init_variables:
unknown __INIT()
{
"a"::__INIT();
a = 4;
return 1;
}
In either case the variable 'b' (in fact all variables) are
set to '0' as part of the loading/cloning process before the
driver performs the specific initialisation.
WARNING
Do not call __INIT() yourself, overload, or use it directly in
any other way. The implementation of the variable
initialization may change at any time.
HISTORY
Before LDMud 3.3.378, the choice between sharing and initializing
variables was a fixed configuration choice of the driver.
SEE ALSO
pragma(LPC), create(H), invocation(D)
|