2011-03-15 12 views
63

C++ ile adlandırılmamış ad alanı ne zaman kullanılır? Özgür durma işlevinden daha iyi midir? Ayrıca, sadece kaynak dosyasında ve başlık dosyasında kullanılmamalıdır?C++ 'da adlandırılmamış ad alanının kullanımı

+2

aşağıda verilen linke tıklayın aynı adı arasındaki çatışmaları çözmek: [? Statik üzerinde isimsiz ad alanının Üstünlüğünü] (http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz

cevap

57

Stroustrup'a göre, eski C'deki static globals'ı yaptığınız yerlerde kullanmalısınız. Buradaki fikir, söz konusu öğelerin içinde bulundukları kaynak dosyaya "genel" olabileceği, ancak derlemenizdeki diğer kaynak dosyaların ad alanını kirletemeyeceği.

Başka bir deyişle, , C++ numaralı telefondan static globals oluşturmamalısınız. Bunun yerine adlandırılmamış ad alanları kullanmalısınız.

Başlık dosyalarında yararlı oldukları bazı durumlar buldum, ancak bu nadirdir. Çoğunlukla fırlatabilir istisnalar bildirmek için düşünüyorum. Bu durumda, söz konusu tanımlar, #include'un bu başlığa ait olduğu her şey için global olacak, ancak olmayan şeyler için geçerli olacaktır.

+2

isimli bir isim alanına taşınacağım, statik 'artık FCD'nin son sayısında (n3225) onaylanmamış olarak işaretlendi. Komite, tek bir işlev veya küresel için daha az ayrıntılı olduğunu kabul etti. Bildirimin yanında göründüğü ve ayrıştırıcı gerektirmediği için "grep" de daha kolaydır. –

+6

@Matthieu: ancak daha sonra işlevler iç bağlantıya sahiptir. Adsız ad alanlarının "üstün" olarak adlandırılmasının asıl nedeni, nesnenin/işlevin bağlantılarını değiştirmekten ziyade sembolü "gizlemek" dir, bu da insanların genellikle kullandıklarında elde etmek istedikleri şeyle daha yakın bir eşleşmesidir. Bu, C++ 0x'da değişmedi, (1) eğer dış bağlantının pahalı olacağını düşünürseniz, o zaman içsel bağlantı istediğinizi fark ettiler, ki bu da 'statik' anlamına gelir ve (2) 'uyumluluğundan dolayı bu bağlamda asla' statik'i kaldırmayacağım, bu yüzden kullanımdan kaldırılması boş bir tehdittir. –

+2

@Steve: Bağlantıyı da değiştirmeyi beklerdim, kimsenin sembolü bilmiyorsa onu dışarıda tutmanın amacı nedir? –

8

İsim gizlemek için kullanılır. Adsız her ad alanı benzersizdir. Bağlantı here daha ayrıntılı olarak açıklanmaktadır. Tipik olarak sadece iç bağlantıya sahip olması gereken (örneğin dış dünyaya maruz kalmayan) fonksiyonları gizlemek için bir kaynak dosyasında kullanılır.

25

Adsız ad alanı çeviri birimine özeldir ve bu, genel değişkenleri ve işlevleri farklı çeviri birimlerinde aynı isimlerle korumak için kullanılabilir, böylece hiçbir bağlantı çakışması ortaya çıkar. Örneğin, yalnızca bir .cpp dosyasında tanımlanacak ve yalnızca bu dosya içinde kullanılacak bir sınıfa ihtiyacınız vardır. CModuleLock'u aramak istiyorsunuz. Adsız bir ad alanında ve başka bir .cpp dosyasında bulunmuyorsa, başka bir adla CModuleLock adında bir adsız ad alanı bulunmuyorsa, programınızı bağlayamazsınız.

+0

Bazen özel iç sınıf olabilecek sınıflar için adsız ad alanlarını kullanıyorum, ancak benzer sınıflar arasında paylaşmak istiyorum (belki de aynı kavramı uygulayanlar). Tabii ki sınıf yeterince genel hale geldiyse, – RichardBruce

1

Adlandırılmamış ad alanları, genel statik değişkenlerin ve işlevlerin "C++ sürümü" dür. Sınıflar için adsız bir ad alanı da kullanabileceğinizi unutmayın.

İlgili konular