C geçersiz bir işlev çağrısı
Aramalar günlüğü uğruna birçok API için bazı işlev çağrıları geçersiz kılmak istiyorum, ama aynı zamanda gerçek işlevi için gönderilmeden önce verileri işlemek isteyebilirsiniz.
Örneğin, benim kaynak kodu bir fonksiyon getObjectName
denilen binlerce kez kullanıyorum diyelim. Bu işlevin davranışı farklı sonucunu görmek için değiştirmek istiyorum, çünkü bu işlev geçici olarak geçersiz kılmak için bazen istiyorum.
Yeni bir kaynak böyle dosya: ben oluşturmak
#include <apiheader.h>
const char *getObjectName (object *anObject)
{
if (anObject == NULL)
return "(null)";
else
return "name should be here";
}
Ben her zamanki gibi tüm diğer kaynak derleme, ama ilk API kütüphanesi ile bağlantı önce bu fonksiyonu karşı link. Bu tabii ki öncelikli görevim içinde gerçek işlevi arayamam dışında gayet iyi çalışıyor.
"Bağlama/derleme hataları/uyarılar olmadan mı?" bir işlevi geçersiz kılmak için daha kolay bir yoldur İdeal sadece derleme ve fazladan bir ya da iki dosya bağlayarak işlevi geçersiz kılmak mümkün oldukça çok seçenek bağlama ya da gerçek kaynak benim program kodu değiştirme ile uğraşmak istiyorum.
CEVAP
Linux altında gcc ile, bu gibi --wrap
linker bayrağı kullanabilirsiniz:
gcc program.c -Wl,-wrap,getObjectName -o program
ve fonksiyon olarak tanımlayın:
const char *__wrap_getObjectName (object *anObject)
{
if (anObject == NULL)
return "(null)";
else
return __real_getObjectName( anObject ); // call the real function
}
Bu getObjectName()
tüm aramalar için sarıcı fonksiyon (bağlantı) için yönlendirilir emin olun. Çok yararlı bu bayrak, Mac OS X altında gcc ancak yok
Eğer g da derleme iseniz extern "C"
sarıcı işlev bildirmek için unutma.
Önceki fonksiyon tamamlandıktan sonra ...
Nasıl 5 saniye için bir işlev çağrısı ...
saf JavaScript jQuery eşdeğer'in ...
AngularJS : izole kapsamında olmayan b...
Neden bir işlev çağrısı daha hızlı ola...