2009-02-09 8 views
8

böyle ilan:C de "CALLBACK" bildirimi ne yapar? Ben <a href="http://www.libsdl.org" rel="noreferrer">SDL</a> kütüphanesinden bazı kodunu gözden ve bir fonksiyonu karşıdan karşıya geldi

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 

Şimdi, bir Delphi kodlayıcısı değilim. Habo yok muy bien, senor. Ancak, üniversite derslerimden şu şekilde okumak için yeterli sözdizimini hatırlıyorum:

İşlev adı WndProc. Bağımsız değişken listesi oldukça açıklayıcıdır. İşlev dönüş tipi LRESULT. Ama dünyada "CALLBACK" ne yapıyor? Delphi'de, herhangi bir işlev geri arama olarak kullanılabilir; Sadece doğru tipte fonksiyon göstericisini geçmeniz gerekiyor. C'nin bu şekilde çalışmadığı özel bir neden var mı? Yoksa farklı bir şey mi ifade ediyor?

cevap

2

Bu çağrı kuralı bu. Bu işleve bir işaretçi daha sonra bu işlevi çağırır bir Windows API'ye geçirdiğinizde gereklidir. Windows çağırma kuralı C çağırma kuralından farklıdır, bu nedenle WndProc() 'ın özel olduğu ve farklı başlatma ve temizleme kodlarına ihtiyaç duyduğu derleyiciyi belirtmeniz gerekir.

0

Bu bir çağrı kuralı ve Delphi de var. Delphi Yardımı 'cdecl' bakmaya çalışın. Delphi'de (ya da Object Pascal olarak adlandırdığımız gibi) çağrı kuralları, işlev bildiriminin ardından gelir;

function MyFunction(X, Y: Real): Real; cdecl; 
Raymond Chen'in Blogu'ndan
4

Kısa haberleri: x86 platformu üzerinde kuralları çağıran yaklaşık

büyük bir şey seçmek için pek çok vardır olduğunu! Bu parametre, bir değişken sayıda fonksiyon kullanımına izin verir, çünkü

C çağırma kuralı (__Cdecl)

Cı çağrı kuralı sınırlıdır. Neredeyse, istifin arayan tarafından temizlenmesini ve parametrelerin sağdan sola itilmesini gerektirir, böylece birinci parametre yığının tepesine göre sabit bir konumdadır. Özetle: Arayan yığını, sağa sola itilen parametreleri temizler. o çağrılan tarafından temiz kuralını kullanabilmesi

Pascal çağırma kuralı (__pascal)

Pascal, parametrelerin değişken sayısı ile işlevlerini desteklemez. Parametreler soldan sağa doğru itilir. Hemen hemen tüm Win16 işlevleri Pascal çağrı kuralı olarak dışa aktarılır. Callee-clean kongre, her bir çağrı noktasında üç bayttan tasarruf eder ve her bir işlev için sabit bir iki baytlık yük vardır. Aynı zamanda daha hızlıydı. Win16'da birkaç yüz bayt ve birkaç döngü tasarrufu büyük bir işti. Not: Fortran çağrı kuralı (__fortran), Pascal çağrı kuralı

ile aynıdır.
İlgili konular