2015-08-21 31 views
5

Delphi - const ve var bildirimleri için derleyici zamanında çalıştırılabilir kendi compile-time functions'u yazabilir miyim.Delphi derleme zamanı işlevleri nasıl yazılır

Standart Delphi lib, sabit başlatma için kullanılan Ord(), Chr(), Trunc(), Yuvarlak(), Yüksek() vb. Gibi rutinleri içerir.

Derleme zamanında rutini yürütmek ve sonucu sabit olarak kullanmak için kendim yazabilir miyim?

+1

Hayır. Önişlemciye ihtiyacınız olacaktır. – TLama

+0

belki de soru bir özel preprocessor –

+1

@Jasper yazmak nasıl olmalıdır Soru oldukça açıktır. Harici dahili sistemler destekleniyor mu? –

cevap

7

Kendi içsel işlevlerinizi yazamazsınız. Çünkü bu derleyici büyüsü gerektirir.
Bununla birlikte, hedefinize ulaşmak için başka seçenekler de olabilir.

Preprocessor
tek yolu önişlemci kullanmaktır.
birkaç vardır: http://wiki.delphi-jedi.org/wiki/JEDI_Pre_Processor

http://sourceforge.net/p/dpp32/wiki/Home/history

Andreas Hausladen bu konuda kendi çalışmalarını sadece açık bir kaynaktan elde ettiği Delphi önişlemci.
Gerçekten bir ön işlemcisi değil, bir dil genişleticisi.
https://github.com/ahausladen/DLangExtensions

önişlemciler sorun, orijinal (önce ön-işleme) kaynak kodu ve Delphi derler kaynak kodu arasında bağlantı öldürür olmasıdır.
Bu, orijinal kaynağınız için hata ayıklama bilginizin olmayacağı anlamına gelir.
(harita dosyasını yeniden yazmazsanız).

Eğer özgü bir fonksiyon olarak hemen hemen aynı verim elde etmek inlining kullanabilirsiniz yapmak istediğinize bağlı
satır içine almak. Bkz: https://stackoverflow.com/a/6401833/650492

Eğer instrinsic fonksiyonları oluşan bir kod bloğu varsa
, tam sonuç derleme zamanında değerlendirilecektir iç işlevlerini kullanarak ifadeleri Construct, toplam yapı çalışmalarını yaparak bu içsel sanki işlevi.

Not aşağıdaki gibidir (saçma) Örnek: satır içi ve sadece iç işlevlerini (ve derleyici yönergeleri) kullandığı için

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; 

, fonksiyon bir sabite compiletime karara olup olacak herhangi bir kod üretmek .

3

Derleme zamanında rutini yürütmek ve sonucu sabit olarak kullanmak için kendi başıma yazabilir miyim?

Hayır yapamazsınız. Bu işlevler derleyicide yerleşiktir ve eğer üçüncü tarafların işlevlerini yerleşik olarak sağlamasına izin verecek bir genişletme mekanizması sunmuyorsa.

İlgili konular