Default
Default is
- a compiler intrinsic function returning a zeroed out value, or
- a keyword marking a class’s array property as implicitly accessible.
This article describes the compiler intrinsic. See other articles for the notion in OOP.
zero-idiom
Since FPC 3.0.0 default(dataType) returns a zero value for the specified dataType.
program defaults(input, output, stdErr);
var
i: integer;
s: string;
r: tOpaqueData;
begin
i := default(integer); { assigns `0` }
s := default(string); { assigns `nil` or `''` (empty string) }
r := default(tOpaqueData); { assigns `tOpaqueData[]` }
end.advantages
- The most important “advantage” is that
defaultcan be used ingenericdefinitions with template parameters.
{$mode objFPC} { --- generic thing -------------------------------------- } type
generic thing<storageType> = object
data: storageType;
constructor init;
end;
constructor thing.init; begin
data := default(storageType);
end;
{ === MAIN =============================================== } type
arr = array[1..10] of integer;
var
x: specialize thing<tBoundArray>;
y: specialize thing<arr>;
begin end.
In the context of the definition of the generic data type thing it is not yet known what storageType will be. Therefore, we could not possibly write a literal value such as 0 or nil. However, we can use default to overcome this hurdle. Upon specialization the correct zero value will be inserted.
- Furthermore, the compiler can choose a faster implementation than, for instance, a respective
fillChar(myVariable, sizeOf(myVariable), chr(0)).
caveats
- Despite its name,
defaultis really just a synonym for zero. It can be used to assign values out of range:
{$rangeChecks on} type
typeWithoutZeroValue = -1337..-42;
var
i: typeWithoutZeroValue;
begin
i := -1024; { ✔ OK }
{i := 0; ✘ not OK }
i := default(typeWithoutZeroValue); { OK again }
writeLn(i);
end.
See FPC issue 34972.
see also
From the Free Pascal wiki, page "Default", as it stood on 2022-04-01 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.