Vincent Robert yaptığı açıklamada doğru C ++ 'ta ad alanlarını nasıl kullanıyorsunuz? .
Ad boşluğu kullanma
İsim alanları, isim çarpışmasını önlemek için en azından kullanılır. Java'da bu, "org.domain" deyimiyle zorunlu kılınmıştır (çünkü kişinin kendi alan adından başka bir şey kullanmayacağı varsayılır).
C ++ ile, modülünüzdeki tüm koda bir ad alanı verebilirsiniz. Örneğin, MyModule.dll modülü için koduna MyModule ad alanı verebilirsiniz. Başka bir yerde MyCompany :: MyProject :: MyModule kullanan birini gördüm. Sanırım bu aşırıya kaçmış, ama sonuçta benim için doğru görünüyor.
"Using" kullanma
Bir ad alanından bir (veya tüm) sembolü geçerli ad alanınıza etkili bir şekilde içe aktardığı için kullanmak büyük bir dikkatle kullanılmalıdır.
Bu, bir başlık dosyasında yapmak için kötüdür, çünkü başlığınız dahil her kaynağı kirletecektir (bana makroları hatırlatır ...) ve hatta bir kaynak dosyada, işlev kapsamının dışındaki kötü stil, global kapsamda içe aktarılacağı için ad alanından semboller.
"Using" kullanmanın en güvenli yolu, seçili sembolleri içe aktarmaktır:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Bir çok "namespace std kullanma;" öğretici veya örnek kodlarda. Nedeni, okumayı kolaylaştırmak için sembol sayısını azaltmaktır, çünkü bu iyi bir fikirdir.
"ad alanı std kullanarak;" Scott Meyers tarafından önerilmez (tam olarak hangi kitabı hatırlamıyorum ama gerekirse bulabilirim).
Ad Alanı Kompozisyonu
Ad alanları paketlerden daha fazlasıdır. Başka bir örnek Bjarne Stroustrup'un "C ++ Programlama Dili" nde bulunabilir.
"Özel Sürüm" de, 8.2.8 Ad Alanı Kompozisyonu'nda , iki AAA ve BBB ad alanını CCC adlı başka bir alanla nasıl birleştirebileceğinizi açıklar. Böylece CCC hem AAA hem de BBB için bir takma ad haline gelir:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Kendi özel ad alanı arayüzünüzü oluşturmak için farklı ad alanlarından seçilen sembolleri bile içe aktarabilirsiniz. Henüz bunun pratik bir kullanımını bulamadım, ancak teorik olarak, havalı.
std
ad alanının sembollere önek olarak kullanılmasına hiç alışmaktan daha iyidirusing
. Bu yüzden hep yazıyorumstd::cout
ya dastd::string
şimdi çünkü onlara şimdi böyle diyorum. Asla yazmamcout
.