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;
c++
namespaces
c++builder
Roddy
źródło
źródło
Odpowiedzi:
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.
źródło
Nie, nie możesz użyć przestrzeni nazw. Jedyne, co możesz zrobić, to
using namespace
zablokować -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.
źródło
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
źródło
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źródło
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
Szybki eksperyment z Visual Studio 2005 pokazuje, że możesz zawrzeć te nagłówki we własnej nazwanej przestrzeni nazw, a następnie
use
to, czego potrzebujesz z tej przestrzeni nazw (ale nieuse
całą przestrzeń nazw, ponieważ wprowadzi ona przestrzeń nazw, którą chcesz ukryć.źródło
#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); }
źródło