Jak Mogę "anulować" przestrzeń nazw?

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

using namespace xyzzy

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

Czy Jest jakiś sposób, abym mógł w jakiś sposób anulować/nadpisać poprzednią instrukcję "using", aby tego uniknąć.

Może...
unusing namespace xyzzy;
Author: Roddy, 2008-10-03

7 answers

Nie. Ale istnieje potencjalne rozwiązanie: jeśli umieścisz swoją dyrektywę include W własnej przestrzeni nazw, jak to...

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

...następnie efekty użycia dyrektyw w tym nagłówku są zneutralizowane.

To może być problematyczne w niektórych przypadkach. Dlatego każdy przewodnik po stylach C++ zdecydowanie zaleca , a nie umieszczanie dyrektywy "using namespace" w pliku nagłówkowym.
 48
Author: Head Geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 17:39:08

Nie możesz nie używać przestrzeni nazw. Jedyne, co możesz zrobić, to umieścić using namespace-statement blokiem, 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.

 40
Author: jk.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 02:29:50

Możesz utknąć używając jawnych przestrzeni nazw w konfliktach:

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
 13
Author: Eclipse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-12 22:17:09

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

 9
Author: cdelacroix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 23:17:22

Co powiesz na użycie sed, Perla lub innego narzędzia wiersza poleceń w ramach procesu budowania, aby zmodyfikować wygenerowane nagłówki po ich wygenerowaniu, ale zanim zostaną użyte?

 7
Author: Arkadiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 17:55:23

Szybki eksperyment z Visual Studio 2005 pokazuje, że możesz zamknąć te nagłówki we własnej przestrzeni nazw, a następnie {[0] } to, czego potrzebujesz z tej przestrzeni nazw (ale nie use cała przestrzeń nazw, ponieważ wprowadzi przestrzeń nazw, którą chcesz ukryć.

 1
Author: Kasprzol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 17:37:54
#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
Author: Narendra kumawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-02 04:56:37