Jak mogę „nie używać” przestrzeni nazw?


86

Jedną z kaprysów mojego systemu programistycznego (Codegear C ++ Builder) jest to, że niektóre automatycznie generowane nagłówki nalegają na posiadanie ...

using namespace xyzzy

... stwierdzeń w nich, które wpływają na mój kod, kiedy najmniej tego chcę lub oczekuję.

Czy istnieje sposób, aby w jakiś sposób anulować / zastąpić poprzednią instrukcję „using”, aby tego uniknąć.

Może...

unusing namespace xyzzy;

3
Prawdopodobnie powinieneś otworzyć raport o błędzie z ich systemem kontroli jakości: qc.codegear.com
Kris Kumler

2
BTW, które to automatycznie generowane nagłówki?
Kris Kumler,

2
Pewnego dnia C ++ będzie miał moduły, a włączenie kodu do innego kodu będzie miało lepsze konstrukcje hermetyzacji. Do tego czasu nie da się tego łatwo obejść. Rozważ umieszczenie własnego kodu w przestrzeni nazw i odnoszenie się do niego w ten sposób.
Trevor Hickey

Odpowiedzi:


59

Nie. Ale jest potencjalne rozwiązanie: jeśli umieścisz dyrektywę include w jej własnej przestrzeni nazw, na przykład ...

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

... wtedy skutki wszelkich dyrektyw using w tym nagłówku są neutralizowane.

W niektórych przypadkach może to być problematyczne. Dlatego każdy C ++ przewodnik styl zdecydowanie zaleca nie oddanie „używając nazw” dyrektywy w pliku nagłówka.


1
Ogólnie jest to okropny pomysł. Nagłówki C ++ nie są przeznaczone do umieszczania w alternatywnej przestrzeni nazw, tak jak zostało to tutaj użyte.
Aaron

25
To okropny pomysł, aby zawrzeć dyrektywę using także w pliku nagłówkowym. To po prostu łagodzi ten problem.
Head Geek

4
Umieszczenie nagłówka we własnej przestrzeni nazw nie jest rozwiązaniem, ponieważ zmienia znaczenie deklaracji w tej bibliotece. (-1)
Richard Corden,

4
To zależy całkowicie od tego, co jest zadeklarowane w nagłówku.
Head Geek

1
Właśnie dlatego jest to niezdefiniowane zachowanie.
Kris Kumler,

56

Nie, nie możesz użyć przestrzeni nazw. Jedyne, co możesz zrobić, to using namespacezablokować -statement, aby ograniczyć jego zakres.

Przykład:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Może możesz zmienić szablon, który jest używany z automatycznie generowanych nagłówków.


Czy możesz zawinąć dołączenie w taki blok?
Eclipse

Tak, nie będzie z automatycznie generowanym kodem. Czy może on zmienić szablon dla automatycznie generowanego kodu?
jk.

Tak, to tak naprawdę nie rozwiązuje problemu, jaki ma z nagłówkami używającymi przestrzeni nazw.
Kip

Niestety to nieprawda. Spróbuj tego:
Adam

przestrzeń nazw xyzzy {const int i {using namespace xyzzy; } // przestań używać przestrzeni nazw xyzzy tutaj
Adam

17

Możesz utknąć, używając jawnych przestrzeni nazw w przypadku konfliktów:

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

Do przyszłego odniesienia: od wersji XE jest nowa wartość, którą możesz # using namespace System;zdefiniować, aby uniknąć przerażającego int, obejmują: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


Ale to wydaje się nie działać prawidłowo. Przynajmniej we wszystkich przypadkach próbowałem (z BCB6). Potem wracałem do dodawania jawnych przestrzeni nazw w przypadku konfliktu i - co gorsza - dołączałem nagłówek, aby uniknąć konfliktów nazw typów ...
Wolf

6

Co powiesz na użycie seda, perla lub innego narzędzia wiersza poleceń jako części procesu budowania, aby zmodyfikować wygenerowane nagłówki po ich wygenerowaniu, ale przed ich użyciem?


1

Szybki eksperyment z Visual Studio 2005 pokazuje, że możesz zawrzeć te nagłówki we własnej nazwanej przestrzeni nazw, a następnie useto, czego potrzebujesz z tej przestrzeni nazw (ale nie usecałą przestrzeń nazw, ponieważ wprowadzi ona przestrzeń nazw, którą chcesz ukryć.


1
Prawdopodobnie spowoduje to problemy z manipulowaniem nazwami, jeśli pliki nagłówkowe są deklaracjami biblioteki. Kompilacja powiedzie się, ale konsolidator nie będzie w stanie znaleźć definicji, ponieważ zostałyby one już skompilowane w innej przestrzeni nazw.
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
proszę wyjaśnij swoją odpowiedź!
Mazz

możesz użyć operatora rozpoznawania zakresu, aby użyć innej zmiennej przestrzeni nazw
Narendra kumawat

3
Nie odpowiada na pytanie
MM
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.