2016-04-19 13 views
5

Sprawdź to demo source z doskonałej biblioteki Objazd:Co oznacza "cdecl = zero" (umieszczone po deklaracji funkcji)?

implementation 

{$R *.dfm} 

var 
    TrampolineGetMemory: function(Size: NativeInt): Pointer; 
cdecl = nil; 

Proszę spojrzeć na rachunku cdecl = nil;. Co to oznacza w tym kontekście?

Uwaga - już wiem, że cdecl oznacza konwencję telefoniczną.

+3

To samo co 'var I: Integer = 42;' –

+2

@DavidHeffernan Myślę, że zwłaszcza inicjalizacji, w niektórych programach, w rzeczywistości może zyskać Ci około dziesięć milionów lat wzrostu perf. –

Odpowiedz

7

To kolejny sposób na zainicjowanie zmiennej. Na przykład:

program Project1; 

{$APPTYPE CONSOLE} 

var 
    i : integer = 5; 
begin 
    WriteLn(i); 
    ReadLn; 
end. 

może być jaśniejsze, jeśli został on napisany w jednym wierszu jako

var 
    TrampolineGetMemory: function(Size: NativeInt): Pointer; cdecl = nil; 

a może nawet lepiej, jeśli typ został zdefiniowany:

type 
    TTrampolineGetMemory = function(Size: NativeInt): Pointer; cdecl; 

//... 
var 
    TrampolineGetMemory: TTrampolineGetMemory = nil; 
+0

Należy zauważyć, że jest on całkowicie nadmiarowy, ponieważ zmienne globalne są w każdym razie inicjowane do '0/nil/false' - zobacz [Czy zmienne delphi są inicjowane domyślnie z wartością?] (Http://stackoverflow.com/questions/132725/are-delphi -variables-initialized-with-a-value-by-default). Jest to jak inicjowanie programu obsługi zdarzeń do zera lub pola boolowskiego do false w konstruktorze - zupełnie bezcelowe –

+0

@GerryColl Rzeczywiście tak jest. Czasami jednak standardy kodowania będą dyktować takie rzeczy (jak sądzę?). Mogą być wyraźne dla jasności, a może tylko odruch przeniesiony z miejscowych. Nie jest to konieczne, ale nie jestem pewien, czy posunęłbym się tak daleko, by nazwać to błędem. –

+0

Widzenie w konstruktorze wartości 0 oznacza dla mnie kodowy zapach - oznacza to, że oryginalny koder albo nie rozumiał Delphi, albo nie dało się go znaleźć, aby dowiedzieć się, co jest domyślne. –

7

TrampolineGetMemory jest proceduralny zmienna zainicjowana na nil.

Łatwiej jest sprawdzić, czy przepisany jak

type 
    TTrampolineGetMemory = function(Size: NativeInt): Pointer; cdecl; 
var 
    TrampolineGetMemory: TTrampolineGetMemory = nil;