2014-07-04 15 views
8

Pracuję nad małym osobistym projektem C++ używającym STL. Nie lubię mieć "std::" w każdym miejscu w moich plikach nagłówkowych, ponieważ uważam, że utrudnia to czytelność, ale jednocześnie nie chcę później powodować problemów poprzez umieszczenie using namespace std w pliku nagłówkowym.Ograniczanie zakresu "używania przestrzeni nazw" w pliku nagłówkowym

Więc zastanawiam się, czy istnieje sposób, aby ograniczyć zakres deklaracji using tak, że odnosi się do zawartości mojego pliku nagłówka, ale nie ma zastosowania do plików, które zawierają go. Próbowałem różnych rzeczy, takich jak to, ale wydaje się, że wprowadzenie zakresu w ten sposób nie jest dozwolone poza definicją funkcji. Czy istnieje sposób, aby zrobić to, co chcę?

Uwaga: Naprawdę nie interesuje mnie dyskusja, czy to dobry pomysł, chcę tylko wiedzieć, czy da się to zrobić.

+1

Moja błędna odpowiedź została usunięta. Przeprosiny. Zawsze w pełni kwalifikuję nazwy w nagłówkach (a nawet w plikach cpp teraz) z przyzwyczajenia. Powszechnie jest mieć podstawy kodu, które deklarują własny wektor, więc pomocne jest zobaczenie std :: vector, aby uniknąć niejednoznaczności. To jednak nie pomoże ci odpowiedzieć na twoje pytanie. – M2tM

+0

@ M2tM dzięki, nie ma problemu. – Nathaniel

Odpowiedz

5

Tak, myślę, że można to zrobić.

Aby to osiągnąć, musisz zbudować własny obszar nazw. Napisałem kod, który działa zgodnie z oczekiwaniami.

plik nagłówka wygląda następująco:

#include <iostream> 
namespace my_space { 
    using namespace std; 

    void mprint() 
    { 
     /* 
     * This is working. It means we can access 
     * std namespace inside my_space. 
     */ 
     cout << "AAA" << endl; 
    } 
}; 

plik Realizacja wygląda następująco:

#include "my_header.h" 

int main() 
{ 

    /* 
    * Working Fine. 
    */ 
    my_space::mprint(); 

    /* 
    * It gives a compile time error because 
    * it can't access the std namespace 
    */ 
    cout << "CHECK" << endl; 
    return 0; 
} 

Proszę dać mi znać, jeśli ten nie spełnia Państwa wymagań. Możemy się nad tym zastanowić.

+3

Należy pamiętać, że może to mieć niezamierzone konsekwencje. Ustanawiając 'using namespace blah;' w innej przestrzeni nazw w pliku nagłówkowym, celowo wciągasz * wszystko * w tej przestrzeni nazw, która została zawarta w obecnej jednostce tłumaczeniowej do i teraz włączając * twój * nagłówek, ale nie dalej. Różne jednostki tłumaczeniowe, w tym ten sam nagłówek, mogą pobierać deklaracje i definicje w używanym obszarze nazw, a nagłówek (twój) jest całkowicie nieświadomy tego faktu. Jest to jeden z wielu powodów, dla których używanie "namspace" idealnie nadaje się do ustanawiania * after * all includes in a TU. – WhozCraig

+0

Mogę pójść z takim rozwiązaniem, ale problem polega na tym, że spycha zmarszczkę w jednym miejscu, aby pojawiła się w innym. Mój kod pliku nagłówkowego jest całkiem wolny od 'std ::', ale kod, który go używa, jest obsypany 'my_space ::'. Jeśli zrobię "using namespace my_space", to zaimportuje wszystko z 'std' do globalnej przestrzeni nazw, czego staraliśmy się uniknąć. – Nathaniel

+0

Zgadzam się z tobą, Natanielu. Ale musisz przełknąć gorzką pigułkę w jednym miejscu lub drugim. –

3

Nie, nie można tego zrobić. Twoja próba wprowadzenia zakresu w nagłówku nie powiodła się dokładnie dlatego, że nie ma czegoś takiego jak zakres nagłówka - pliki nagłówków nie mają specjalnego statusu podczas kompilacji. Jednostki tłumaczeniowe są plikami źródłowymi uzyskanymi po wykonaniu preprocesora. Zatem wszystkie dyrektywy include po prostu rozszerzają odpowiednie pliki nagłówkowe. Zapobiega to w dowolny sposób tworzeniu zawartości pliku nagłówkowego.

Powiązane problemy