C'de default fonksiyon

Başlatan Klein, 21 Kasım 2012, 22:16:11

Klein

Bir kaynak dosyamız var.  Bu dosyada bir fonksiyon çağırıyoruz.  Ama bu fonksiyonun yapacağı işler o an yazdığım programa göre değişiyor (programın  çalışması esnasında dinamik olarak değişmiyor). 
İstiyorum ki , Bu fonksiyonun farklı bir iş yapması gereken bir program yazıyorsam, ben bu kütüphane dosyasına hiç dokunmayayım. Hatta header dosyasına bile dokunmayayım. 
Programımda bir tanım yapayım,artık default fonksiyonum yerine benim yazacağım yeni fonksiyon çağırılsın. 

Bunu şimdilik fonksiyon işaretçisi ile hallediyorum. Başka bir yöntemi var mı? onu öğrenmek istedim.

yamak

Hocam sizin nasıl yaptığınızı bilmiyorum ama.Belki de aynı yöntemdir.Eğer c++ da yapmak sorun değilse. C++ da fonksiyonların aşırı yüklenmesi diye bi olay var. İlk fonksiyon parametresiz olur ve bu fonksiyon defaul olarak çalıştırılacak fonksiyon olur.İkinci fonksiyon da parametre olarak başka bi fonksiyonun adresini alır ve adresi girilen fonksiyonu çalıştırır.Siz de bi fonksiyon tanımlarsınız bu fonksiyona parametre olarak gönderirsiniz.

Klein

#2
Yok C++ ile değil, C ile yapacağım.  Aşırı yükleme işimi görmez.

Şimdilik şöyle yapıyorum:
bir fonksiyon işaretçisi tanımlıyorum.  Bu işaretçiye  default fonksiyonumun adresini veriyorum.
Eğer başka bir fomnksiyon çağırılmasını istiyorsam, bu işaretçiye yeni fonksiyonumun adresini veriyorum.


Tagli

Pre-processor ifadeleri ile yapılamaz mı? #ifdef #ifndef falan gibi?
Gökçe Tağlıoğlu

Klein

işte o ifadeyi arıyorum.

şöyle :

#ifndef _ALTERNATE_FUNC_
uint16_t function( uint16_t  parameter){
   return 0;
}

#endif

Eğer aşağıdaki tanım yapılmamışsa, function yukarıdaki haliyle derleniyor.

#define _ALTERNATE_FUNC_

tanımı yapılmışsa fonksiyonu  dışarıdan alıyor. Buraya kadar sorun yok.

Ama derleme esnasında bu tanımı görebilmesi için , kütüphanenin header dosyasına eklamam gerek  ki ben bunu istemiyorum. Ya da  ilgili kütüphanede main.c dosyama referans vermem gerek ki , bunu hiç istemiyorum.









Tagli

Google'da "Overriding a library function" diye arattım. Bu çözüm olabilecekmiş gibi görünüyor ama emin değilim: http://stackoverflow.com/questions/617554/override-a-function-call-in-c

Anladığım kadarıyla, kütüphane fonksiyonunu bir #define ile saklamış.
Gökçe Tağlıoğlu

Klein

Oradaki örneklerin çoğu, şu an yaptığım gibi  fonksiyon işaretçisi ile halletmiş. 
Birisi farklı bir yol izlemiş. O yol da bana fikir verdi.

_ALTERNATE_FUNC_  ifadesini  derleyici parametresine eklemek aklıma gelmemişti.

Tamamdır. Çözüldü.