2016-04-19 7 views
5

Controllare questo demo source dalla biblioteca eccellente Detour:Che cosa significa "cdecl = nil" (posizionato dopo una dichiarazione di funzione)?

implementation 

{$R *.dfm} 

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

Si prega di leggere l'informativa cdecl = nil;. Cosa significa in questo contesto?

Nota: so già che cdecl rappresenta una convenzione di chiamata.

+3

Lo stesso che 'var i: Integer = 42;' –

+2

@DavidHeffernan Penso quel particolare l'inizializzazione, in alcuni programmi, può effettivamente far guadagnare circa 10 milioni anni di aumento del perf. –

risposta

7

Questo è solo un altro modo per inizializzare la variabile. Per esempio:

program Project1; 

{$APPTYPE CONSOLE} 

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

può essere più chiaro se è stato scritto su una linea come

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

O forse anche meglio se un tipo è stato definito:

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

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

Si noti che è completamente ridondante poiché le variabili globali sono inizializzate a '0/nil/false' comunque - si veda [Le variabili delphi sono inizializzate con un valore di default?] (Http://stackoverflow.com/questions/132725/are-delphi -variabili-inizializzato-con-un-valore-by-default). È come inizializzare un gestore di eventi su zero o un campo booleano su falso in un costruttore - completamente inutile –

+0

@GerryColl In effetti lo è. A volte gli standard di codifica dettano questo genere di cose, comunque (suppongo?). Potrebbe essere esplicito per chiarezza, o forse solo un riflesso riportato dalla gente del posto. Non è necessario, ma non sono sicuro che potrei andare così lontano da definirlo sbagliato. –

+0

Vedere l'inizializzazione su 0 in un costruttore è un codice per me odoroso: implica che il codificatore originale non ha capito o che Delphi non si è preso la briga di scoprire quale sia l'impostazione predefinita. –

7

TrampolineGetMemory è un procedurale variabile inizializzata su nil.

E 'più facile per vedere se riscritta come

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