SORU
10 Aralık 2008, ÇARŞAMBA


Neden isimsiz ad kullanılır ve faydaları nelerdir?

Ben sadece yeni bir yazılım projesine katıldı ve tasarımı anlamaya çalışıyorum. Proje adı açıklanmayan bir ad sık kullanır. Örneğin, bu gibi bir sınıf tanımı dosyası oluşabilir:

// newusertype.cc
namespace {
  const int SIZE_OF_ARRAY_X;
  const int SIZE_OF_ARRAY_Y;
  bool getState(userType*,otherUserType*);
}

newusertype::newusertype(...) {...

Ne bir isimsiz bir ad alanı kullanmak için neden olabilecek tasarım konuları? Ne avantajları ve dezavantajları nelerdir?

CEVAP
10 Aralık 2008, ÇARŞAMBA


(Şu, bustrikedartık C için geçerli değildir bu konu 11 ama C 03 başvuruda bulundu. Neredeyse hiçbir fark artık (eğer varsa orada, tam hatırlayamıyorum hangi dil avukatı farklar bunlar). C 11).

İsimsiz ad tanımlayıcı yapmak için bir yarar vardıretkiliçeviri birim yerel. Eğer bir ad için çeviri birim başına benzersiz bir ad seçsin gibi davranıyorlar:

namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }

Ekstra adım, boş vücut kullanarak zaten kullanma yönergesi çoktan geçtiği için bu ad alanında tanımlanan ::name gibi tanımlayıcı ad bünyesinde bakabilmeniz önemlidir.

Bu birden fazla çeviri birimleri bulunabilir ücretsiz işlevleri olarak (örneğin) help anlamına gelir, ve bağlantı zaman çatışma, vermiyorlarhepsi benzersiz bir adı benzersiz bir ad nedeniyle beri. Etkisi static anahtar tanımlayıcıları bildiriminde koyabilirsiniz C kullanılan kullanarak hemen hemen aynıdır.static Bu şekilde kullanılan C , beri önerilmiyorisimsiz ad üstün bir alternatif, hatta yazın bir çeviri birimi yerel yapabilme.

namespace { int a1; }
static int a2;

Her iki a'çeviri birim yerel ve bağlantı zaman çatışma olmaz. Ama fark isimsiz ad a1sadecebenzersiz bir isim alır.Hala dış bağlantı vardır ve nesne dosyası oluşturulan sembol tabloya ihraç edilebilir. Bu şablon bağımsız değişken olarak adresini kullanmak isterseniz: önemli olur

template<int * ptr> struct sample { };

// OK - a1 has external linkage
sample<&a1> s1; 
// NOT OK - translation unit locality is done by giving a2 internal linkage. 
sample<&a2> s2; 

Şablon parametreleri dış bağlantı var bu durumda tanımlayıcı anonim bir ad koymak olmalı.

Comeau-bilgisayar `Why is an unnamed namespace used instead of static? mükemmel bir makale okudum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Erica Griffin

    Erica Griffi

    8 HAZİRAN 2009
  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011