Muhammet Kara

Linux, Özgür Yazılım, Yerelleştirme, Programlama, LibreOffice, C++ ve daha başka şeyler üzerine karalamalarım

C++'a Hızlı Giriş – 02 – İsim Uzayları (Namespaces)

C++’ta isim uzayları, Java’daki paketler gibi, farklı kod parçaları arasındaki benzer adların çakışma sorununu çözmeye yardımcı olur. Örneğin, programınızda kullanmak üzere faktoriyel() isimli bir fonksiyon yazmış olalım. Diyelim ki bir süre sonra, bu işi bizim yazdığımız koddan daha etkili şekilde yapan harici bir kütüphane kullanmaya karar verdik ve bu yeni kütüphanedeki fonksiyonun adı da faktoriyel(). Bu durumda, faktoriyel(3) şeklinde bir çağrı yaptığımızda, derleyicinin bizim fonksiyonumuzu mu yoksa harici kütüphanedeki fonksiyonu mu çağıracağını bilme imkanı olmayacaktır.

İsim uzayları (namespace), tanımlamalarımızı hangi bağlamda yaptığımızı belirtmemize olanak tanıyarak bu sorunu çözer. Herhangi bir kod parçasını belirli bir isim uzayına dahil etmek için, ilgili kodu bir isim uzayı bloku içine koymamız yeterlidir:

//isimuzayi.h
namespace benimisimuzayim
{
  void faktoriyel(int i);
}
//isimuzayi.cpp
#include <iostream>
namespace benimisimuzayim
{
  void faktoriyel(int i)
  {
    std::cout << "benimisimuzayim'daki faktoriyel() fonksiyonu calisti." << std::endl;
    std::cout << "Bu fonksiyon, " << i << " sayisinin faktoriyelini hesaplar." << std::endl;
  }
}

faktoriyel() fonksiyonunun, benimisimuzayim içindeki sürümünü şu şekilde çağırabiliriz:

benimisimuzayim::faktoriyel(i); // "benimisimuzayim" adlı isim uzayındaki
                                // "faktoriyel()" fonksiyonunu çağırır

Her çağrıda isim uzayını tekrar tekrar belirtmek istemiyorsanız, sık kullandığınız bir isim uzayını dosyaya şu şekilde dahil edebilirsiniz:

using namespace benimisimuzayim;

Örnek main dosyamizi da şu şekilde yazalım:

//isimuzayiMain.cpp
#include "isimuzayi.h"

using namespace benimisimuzayim;

int main(int argc, char* argv[])
{
  faktoriyel(3); //benimisimuzayim::faktoriyel(3); yazmakla aynı şeydir
  return 0;
}

Kodlarımızı şu komutla derleyip:

g++ isimuzayiMain.cpp isimuzayi.cpp -o isimuzayi

Şununla çalıştırdığımızda:

./isimuzayi

Şöyle bir çıktı alırız:

benimisimuzayim'daki faktoriyel() fonksiyonu calisti.
Bu fonksiyon, 3 sayisinin faktoriyelini hesaplar.

İsim uzaylarını etkin ve doğru kullanmak, ‘öylesine’ yazılmış kodlarla gelişime açık ve ‘kaliteli’ kodları birbirinden ayıran özelliklerdendir. Yazdığımız kodların rahatça tekrar kullanılabilmesi için de isim uzayı içinde tanımlamakta fayda var.