2015-08-21 20 views
5

Delphi - posso scrivere il mio compile-time functions per le dichiarazioni const e var, eseguibile al momento del compilatore.Come scrivere le funzioni di compilazione Delphi

La lib di Delphi standard contiene routine come Ord(), Chr(), Trunc(), Round(), Alta() ecc., Utilizzate per l'inizializzazione costante.

Posso scrivere da solo, eseguire la routine al momento della compilazione e utilizzare il risultato come costante?

+1

No. Avresti bisogno di un preprocessore. – TLama

+0

forse la domanda dovrebbe essere come scrivere un preprocessore personalizzato –

+1

@Jasper La domanda è abbastanza chiara. Sono supportati gli ins integrati esterni? –

risposta

7

Non è possibile scrivere le proprie funzioni intrinseche. Perché ciò richiede la magia del compilatore.
Tuttavia ci possono essere altre opzioni per raggiungere il tuo obiettivo.

preprocessore
L'unico modo è utilizzare un preprocessore.
Ci sono diverse: http://wiki.delphi-jedi.org/wiki/JEDI_Pre_Processor

Il preprocessore Delphi http://sourceforge.net/p/dpp32/wiki/Home/history

Andreas Hausladen ha appena open source il proprio lavoro in questo senso.
Non è realmente un preprocessore, ma un estensore della lingua.
https://github.com/ahausladen/DLangExtensions

Il problema con preprocessori è che uccide il collegamento tra la (prima del pre-processing) codice originale sorgente e il codice sorgente Delphi compila.
Ciò significa che non avrai informazioni di debug per la tua fonte originale.
(a meno che non si riscriva il file della mappa).

Inlining
A seconda di cosa si vuole fare è possibile utilizzare inline per raggiungere quasi la stessa efficienza come funzione intrinseca. Vedi: https://stackoverflow.com/a/6401833/650492

Costruisci le sue dichiarazioni con le funzioni intrinseche
Se si dispone di un blocco di codice che consiste di funzioni instrinsic, il risultato completo sarà valutata al momento della compilazione, rendendo il lavoro totale costrutto come se fosse un intrinseco funzione.

nota seguente (stupido) Esempio:

function FitsInRegister<T>: Boolean; inline; 
begin 
    if GetTypeKind(T) in [tkString, tkUString] then result:= false 
    else 
    {$IFDEF CPU32BITS} 
    Result:= SizeOf(T) <= 4; 
    {$ELSEIF CPU64BITS} 
    Result:= SizeOf(T) <= 8; 
    {$ENDIF} 
end; 

Poiché è in linea e utilizza solo funzioni intrinseche (e direttive compilatore), la funzione sarà risolto in compiletime ad una costante e non genera alcun codice .

3

Posso scrivere il mio, eseguire la routine al momento della compilazione e utilizzare il risultato come costante?

No, non è possibile. Queste funzioni sono integrate nel compilatore e se non offrono alcun meccanismo di estensione per consentire a terze parti di fornire funzioni integrate.