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;
Roddy
źródło
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.

Head Geek
źródło
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.

jk.
źródło
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
Zaćmienie
źródło
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

cdelacroix
źródło
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?


źródło
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ć.

Kasprzol
źródło
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);
}
Narendra kumawat
źródło
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