SORU
6 Mart 2009, Cuma


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
6 Mart 2009, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Maya Learning Channel

    Maya Learnin

    23 HAZİRAN 2010
  • pissengehen

    pissengehen

    26 EYLÜL 2006
  • YAN TV

    YAN TV

    20 EKİM 2011