Default

From Free Pascal wiki
Jump to navigationJump to search

Default is

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 default can be used in generic definitions with template parameters.
    program defaultDemo(input, output, stdErr);
    {$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, default is really just a synonym for zero. It can be used to assign values out of range:
    program faultyDefault(input, output, stdErr);
    {$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.
  • Default cannot be applied on file or text data types and structured data types containing such.

see also