inline isim alanları (inline namespaces)

C++11 standartlarıyla birlikte giderek popüler hale gelen modern C++ terimi hakkında ne düşünüyorsunuz? Ben böyle terimlerden pek hoşlanmıyorum.  C++17 standartları yayımlanınca modern C++’tan sonra korkarım ultra modern C++ gibi terimleri de duyuyor olacağız. Neyse biz işimize bakalım. Bu yazının konusu C++11 ile gelen yeni araçlardan biri olan inline isim alanları.

inline isim alanları sınıf kütüphanelerinin sürüm (versiyon) kontrolü için getirilmiş bir araç.   Bir isim alanını inline anahtar sözcüğüyle tanıtabiliyoruz:

Böyle bir isim alanı başka bir isim alanı içinde yer aldığında, yani bir içsel isim alanı (nested namespace) olarak kullanıldığında içindeki isimler, kapsayan isim alanının öğeleri gibi görünür oluyor:

Yukarıdaki kodda Project isim alanı içindeki Neco isim alanı inline olarak nitelenmeseydi Project isim alanının görülür olduğu yerlerde içsel isim alanının x isimli öğesine

biçiminde erişecektik. Neco isim alanının inline olması bu öğeye doğrudan

biçiminde erişmemize olanak veriyor. Peki bunun sürüm kontrolü ile ne ilgisi var? Bjarne Stroustrup  C++11‘in yeni araçlarını açıkladığı belgede şöyle bir örnek vermiş:

Örneği olduğu gibi kopyalayıp yapıştırdım. Bjarne’nin örneklerini anlamak için yoğun çaba sarf etmek gerekiyor.

Şimdi yukarıdaki koda bir göz atalım: Örnekte V99.h ve V98.h isimli iki ayrı başlık dosyası var. V98.h 1998 yılında V99.h ise 1999 yılında hazırlanmış olmalı. Burada bizi ilgilendiren V98.h başlık dosyasının kütüphanenin eski sürümüne V99.h başlık dosyasının ise kütüphanenin daha yeni sürümüne karşılık geliyor olması. Her iki başlık dosyası içinde de birer isim alanı tanıtılmış. V99.h başlık dosyasında yer alan V99 isim alanı inline olarak nitelenmiş. Kütüphanenin bu daha sonraki sürümünde int parametreli f isimli işlevin muhtemelen kodu yenilenirken kütüphaneye bir de double parametreli f işlevi eklenmiş. Şimdi de Mine.h isimli başlık dosyasına bakalım. Bu başlık dosyasında oluşturulan Mine isim alanı içinde yer alan #include önişlemci komutlarıyla hem  bu başlık dosyasına hem V99.h hem de V98.h  başlık dosyaları kopyalanıp yapıştırılmış. Önişlemci programı işini gördüğünde derleyici şöyle bir manzarayla karşılaşacak:

Artık Mine isim alanının görülür olduğu her yerde V99 içsel bir isim alanı olmasına rağmen bu isim alanının öğeleri Mine isim alanı içinde doğrudan görünür olacak. Örneğin devamı şöyle:

Yapılan using namespace bildirimiyle Mine isim alanındaki öğeleri Mine ismiyle nitelemeden doğrudan kullanabiliyoruz.  f işlevinin eski sürümünü kullanmak için V98 ismiyle yeni sürümünü kullanmak için V99 ismiyle niteleyebiliriz. V99 isim alanı inline olarak belirlendiğinden artık doğrudan Mine isim alanı içinde görülür hale geldi. f ismini nitelemeden kullandığımızda V99 isim alanı içindeki f ismini kullanmış oluyoruz.

Konunun özü şu: Bir projede farklı sürümler için yapılandırma gerektiğinde öncelikle farklı sürümlere ilişkin kodlar farklı isim alanları içine koyulabilir. Bu isim alanları da birincil isim alanının içine içsel isim alanı olarak yerleştirilebilir. İçsel isim alanlarından biri aktif sürüm olarak seçilip inline olarak bildirilebilir.  Böylece inline olarak seçilen isim alanı içindeki isimler birincil isim alanı içinde doğrudan görünür kılınabilir.

inline içsel isim alanında doğrudan görünür kılınan işlevler argumana bağlı isim aramasına da dahil edilirler.

inline isim alanlar geçişken özelliğe sahip. Aşağıdaki örneğe bakalım:

Yukarıdaki kodda Project isim alanı içinde yer alan Image isim alanı inline olarak nitelenmiş. Image isim alanı içindeki Neco isim alanı da inline olarak nitelenmiş. Bu durumda müşteri kodlar Neco içsel isim alanı içindeki x ismini doğrudan Project ismiyle niteleyerek kullanabilecekler.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun