Şimdi Ara

C de isim çakışması

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
10
Cevap
0
Favori
150
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • aslında bu konu aklıma daha önceden takılmıştı ama hiç böyle bi durum yaşamadım fakat yine yaşama ihtimaline karşı sormak istedim. diğelimki ikitane kütüphane include ettik be 2 kütüphanede de aynı isimde fonksiyon var ver prototipleride aynı şimdi bunları nasıl ayrı olarak kullanacağız ?



  • Birinin içine girip fonksiyonun adını değiştirerek. Büyük ihtimalle hazır kütüphanelerde böyle bir sorun olmayacaktır.

    Fonksiyona verdiğin isimler, fonksiyonun işini açık bir şekilde temsil edebilmeli.

    Dolayısıyla kendi kütüphaneni yazarken böyle bir sorunla karşılaşırsan; ya verdiğin isim kötüdür ya da fonksiyon zaten çakıştığı adaşıyla aynı işi yapıyordur, tekrar tanımlamaya gerek yoktur.

    C'de durumlar böyle. C++'ta ise bu sorun namespace bloklarıyla çözülüyor.
  • gdb G kullanıcısına yanıt
    hocam yani farklı olmak zorundamı ? başka yol yokmu ?
  • Harun2525 H kullanıcısına yanıt
    İsimler farklı olmak zorunda.

    Şöyle bir seçeneğin var: Örneğin A ve B kütüphanelerinin ikisinde de func diye bir fonksiyon var ve sana sadece B kütüphanesindeki func fonksiyonu gerekiyor. Bu durumda A kütüphanesindeki func fonksiyonunu şu şekilde derleyiciden saklayabilirsin:


    #define func __AnlamsizBirYazi
    #include <A.h>
    #undef func
    #include <B.h>


    Böylece A kütüphanesinde func fonksiyonu yerine __AnlamsizBirYazi yazılacak. Daha sonra B'yi include ederken de makroyu devre dışı bıraktığımız için B'deki func kullanılabilir olacak.

    Fakat tabi ki bu profesyonel bir çözüm değil, sadece günü kurtarmaya yönelik bir yöntem. C'de fonksiyonlar global olarak tanımlanır. Kütüphane kütüphane ayrılmaz. Dolayısıyla her birinin eşsiz bir ismi olmak zorundadır.



    < Bu mesaj bu kişi tarafından değiştirildi gdb -- 3 Ağustos 2017; 2:46:37 >
  • gdb G kullanıcısına yanıt
    teşekkür ederim hocam.
  • İsimler kaynak kod olarak varsa sorun değil, değiştirirsin olur biter. Ya 2 tane derlenmiş kütüphanede aynı isimli objeler varsa?
  • hocam vallai efsane yere değindiniz. sahi nasıl bu durumu çözeceğiz ?

    Not: yalnış hatırlamıyorsam .dll, .so vs.. dinamik kütüphanlerde öğeler ayrı bir fonksiyon ile alınıyor. yani mesela get_blabla("set_date") şeklinde dll dosyasından set_date adlı fonksiyon alınıyor yani isim çakışması söz konusu bile değil. tabi yalnış hatırlamıyorsam



    < Bu mesaj bu kişi tarafından değiştirildi Harun2525 -- 4 Ağustos 2017; 3:17:23 >
  • C projelerinde değişken ve fonksiyon isimleri en net şekilde ayarlandığı için öyle bir problem yaşanmaz. Örneğin Linux Kernel projesindeki kütüphanelerde aynı isme sahip deişken ve fonksiyonlar hiç olabilir mi? Veya GTK kütüphanesi, Pango, GDK, ATK, GIO, Cairo ve GLib kütüphanelerini bir arada kullanıyor, o yüzden onlardaki değişken ve fonksiyon isimleri de ona uygun olarak özel seçiliyor. C kütüphaneleri genelde bu şekilde geliştirildiği için isim çakışması yaşanmaz, ancak diyelim ki sürpriz bir çakışma yaşandı ve kütüphane kodlarından düzeltme yapıp tekrar derleyerek sorunu kaynağından düzeltme imkanı yok, o zaman da Windows'ta kütüphaneyi LoadLibrary() ile yükleyip, çakışan fonksiyonu direkt ismiyle değil de GetProcAddress() ile dolaylı olarak cağırıp kullanma yöntemi var. Aynı şey Linux'ta dlopen() ile yapılıyor. Kaynak:

    https://stackoverflow.com/questions/678254/what-should-i-do-if-two-libraries-provide-a-function-with-the-same-name-generati

    < Bu ileti mini sürüm kullanılarak atıldı >




  • tesekkur ederim hocam.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.