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.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
