Bir ad alanını nasıl "kaldırabilirim"?


86

Geliştirme sistemimin (Codegear C ++ Builder) belirsizliklerinden biri, otomatik olarak oluşturulan başlıklardan bazılarının ...

using namespace xyzzy

... içlerindeki ifadeler, en azından istediğimde veya beklediğimde koduma etki ediyor.

Bundan kaçınmak için önceki bir "using" ifadesini bir şekilde iptal etmenin / geçersiz kılmanın bir yolu var mı?

Olabilir...

unusing namespace xyzzy;

3
Muhtemelen QC sistemleriyle bir hata raporu açmalısınız
Kris Kumler

2
BTW, hangi otomatik oluşturulmuş başlıklar bunlar?
Kris Kumler

2
Bir gün C ++ modüllerine sahip olacak ve kodu diğer koda dahil etmek daha iyi kapsülleme yapılarına sahip olacaktır. O zamana kadar, bunun kolay bir yolu yok. Kendi kodunuzu bir ad alanına koymayı ve ona bu şekilde başvurmayı düşünün.
Trevor Hickey

Yanıtlar:


59

Hayır! Ancak olası bir çözüm var: Dahil etme yönergenizi kendi başına bir ad alanına koyarsanız, bunun gibi ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... daha sonra bu başlık içindeki kullanım yönergelerinin etkileri etkisiz hale getirilir.

Bu, bazı durumlarda sorunlu olabilir. Her C ++ stil kılavuzu şiddetle önerir neden yıllardan bu değil bir başlık dosyasında bir "ad kullanarak" yönergesini koyarak.


1
Genelde bu korkunç bir fikir. C ++ üstbilgilerinin, burada kullanıldığı gibi alternatif bir ad alanına dahil edilmesi amaçlanmamıştır.
Aaron

25
Bir başlık dosyasına bir kullanma yönergesi eklemek de berbat bir fikir. Bu, bu sorunu basitçe azaltır.
Head Geek

4
Başlığı kendi ad alanınıza yerleştirmek, bu kitaplıktaki bildirimlerin anlamını değiştirdiği için bir çözüm değildir. (-1)
Richard Corden

4
Bu tamamen başlıkta neyin beyan edildiğine bağlıdır.
Baş Geek

1
Tam da bu yüzden tanımlanmamış bir davranış.
Kris Kumler

56

Hayır, bir ad alanını kullanamazsınız . Yapabileceğiniz tek şey- using namespaceifadesini kapsamını sınırlandırmak için bir blok koymaktır.

Misal:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Belki otomatik oluşturulan başlıklarınız için kullanılan şablonu değiştirebilirsiniz.


Yine de böyle bir bloğa bir eklenti sarabilir misin?
Eclipse

Evet, bu otomatik oluşturulan kodla olmayacak. Byt mybe, otomatik olarak oluşturulan kodun şablonunu değiştirebilir mi?
jk.

Evet, bu, onun ad alanlarını kullanan başlıklarda yaşadığı sorunu gerçekten çözmüyor.
Kip

Ne yazık ki bu doğru değil. Şunu deneyin:
Adam

ad alanı xyzzy {const int i {ad alanı xyzzy kullanarak; } // xyzzy ad alanını burada kullanmayı bırak
Adam

17

Çakışmalarda açık ad alanları kullanmakta kalabilirsiniz:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

10

İleride referans olması için: XE sürümünden bu yana, using namespace System;dehşet verici int'ten kaçınmak için # tanımlayabileceğiniz yeni bir değer var : DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


Ancak bu düzgün çalışmıyor gibi görünüyor. En azından her durumda denedim (BCB6 ile). Daha sonra çatışmaya açık ad alanları eklemeye geri dönüyordum ve - daha da kötüsü - tür adı çakışmalarını önlemek için bir başlık
Wolf

5

Oluşturulan üstbilgileri oluşturulduktan sonra ancak kullanılmadan önce değiştirmek için derleme işleminizin bir parçası olarak sed, perl veya başka bir komut satırı aracını kullanmaya ne dersiniz?


1

Visual Studio 2005 ile hızlı deney, bu başlıkları kendi adlandırılmış ad alanınıza ve ardından usebu ad alanından ihtiyacınız olanı içine alabileceğinizi gösterir (ancak usegizlemek istediğiniz ad alanını tanıtacağından tüm ad alanını değil.


1
Başlık dosyaları bir kitaplık için bildirimlerse, bu muhtemelen ad değiştirme sorunlarına neden olacaktır. Derleme başarılı olacaktır, ancak bağlayıcı tanımları zaten farklı bir ad alanında derlenmiş oldukları için bulamayacaktır.
Eclipse

-1
#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}

1
lütfen cevabınızı açıklayınız!
Mazz

Başka bir ad değişken kullanmak kapsam çözünürlük operatörünü kullanabilirsiniz
Narendra kumawat

3
Soruyu ele almıyor
MM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.