ADL (Argument Dependent Lookup) - 1

14:35 ,

Compiler isim araması yaparken bulunduğu isim alanı ve global isim alanı dışında fonksiyon parametresine bağlı olarak bir arama daha yapmaktadir.


Yukaridaki en temel Argument Dependent Lookup örneğinde görebileceginiz üzere normalde alert() fonksiyonu baska bir isim alanı içerisinde olsa da fonksiyonun parametresi ADL namespace içerisinde oldugu için compiler buraya da bakacak ve sonuç olarak fonksiyon uygun fonksiyon çağrısını yapabilecektir.


Yukarida ise global alanda ve ADL namespace'i icerisinde aynı imzalı fonksiyonlar bulunduğu için  compiler ikilemde kalacak ve asağıdaki gibi derleme hatası verecektir.
 

Yukarıdaki hatayı düzeltmek için fonksiyon çağrısını aşağıdaki gibi yapmak mümkündür.


Şimdi ADL'nin daha kompleks problemlerini inceleyelim:


Yukaridaki örnekte ADL devreye girer ve namespace içerisindeki foo fonksiyonunu çağırır diye tahmin yürütsekte ifade geçerli olmayacak ve compıler bar'ı sadece int türünden bir değişkebn olarak görecek ve aşagıdaki gibi hata ile karşılaşırız. 


Asağıda ise beklentilerin tersine sonuclanan ikinci örneği görmek mümkün. Normalde Mercedes sınıfı içerisindeki foo çağrısı doğrudan sınıfın üye fonksiyonu olan foo() 'nun üzerinden yapılmaya çalışacak ve bunun karşılığı olarak parametreli çağrı yapıldığı için hata verecektir. 


Compiler 2 nolu fonksiyon cağrısını yapmak isteyecek 1 nolu fonkiyonu dikkate almayacaktır. Bu nedenle aşağıdaki gibi derleme hatası oluşacaktır. 


Asağıda ise beklentilerin tersine sonuçlanacak olan üçüncü örneği görmek mümkündür. Burada bar fonksiyonu içerisinde extern fonksiyon bildirimi yapılmıştır.


 Ve bunun sonucu olarak 2. örnektekine benzer bir hata ile karşılaşılmıştır.


Eğer extern bildirimi yapılmazsa global foo() fonksiyonunun bulunması derleme hatasına neden olmayacak ve derleme hatasız sonuçlanacaktır.