Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Konfuzija oko using namespace i namespacea generalno

[es] :: C/C++ programiranje :: C/C++ za početnike :: Konfuzija oko using namespace i namespacea generalno

[ Pregleda: 1678 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

grabber
Gorazde

Član broj: 213110
Poruke: 172
*.PPPoE-5880.sa.bih.net.ba.



Profil

icon Konfuzija oko using namespace i namespacea generalno13.10.2011. u 21:47 - pre 152 meseci
Pozdrav

Imam malu konfuziju oko rada sa namespace-om. O čemu se radi? Ukoliko napravim neki svoj namespace i u njemu definišem recimo jednu varijablu tipa int. i kada u main funkciji uključim cijeli taj namespace, i napravim varijablu koja se zove isto kao ta pomenuta koju sam napravio unutar namespacea, ne javlja nikakvu grešku i uredno ga kompajlira. Međutim ako umjesto uključivanje kompletnog tog namespace, uključim samo tu varijablu iz pomenutog namespacea, dobijem grešku prilikom kompajliranja. Evo na primjeru konkretno. Ovo radi bez greške pri kompajliranju:

Code:
#include <iostream>

namespace a
{
    int m=5;
}

int main()
{
    int m=10;
    using namespace a;
    std::cout<<m<<std::endl;
    return 0;
}


A ovo izbaci grešku "m is already declared in this scope":
Code:
#include <iostream>

namespace a
{
    int m=5;
}

int main()
{
    int m=10;
    using a::m;
    std::cout<<m<<std::endl;
    return 0;
}


Zar uključivanje kompletnog namespacea nije "jače" od uključivanja objekata pojedinačno, tj zar se ne uradi isto ovo i kad uključim cijeli namespace + što bi se uključile i još neke definicije da ih je bilo unutar tog namespacea?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Konfuzija oko using namespace i namespacea generalno14.10.2011. u 10:41 - pre 152 meseci
Ono što ti želiš da uradiš (da prekriješ jedno ime istim imenom iz drugog namespace-a) ne spada u ispravan rad sa C++ jezikom.

Namespace nije napravljen s namerom da se prekrivaju promenljive koje nisu u namespace-u. Namespace služi da nemaš problema kad koristiš dve različite biblioteke od dva različita proizvođača. Ako proizvođači odaberu jedinstvena imena za svoje namespace-ove onda možeš da koristiš njihove biblioteke bez bojazni da se kod neće ni kompajlirati zbog konflikta imena. Using direktiva "using namespace xxx" je samo olakšica za rad sa starim kodom, da ne bi morao da masovno menjaš kod samo da bi se kompajlirao. Preporuka je da u novom kodu svuda koristiš ili puno ime, xxx::šta_god, ili using deklaraciju "using xxx::šta_god". Using deklaracija je korisno rešenje, jer te oslobađa obaveze da dodaješ xxx svaki put kad koristiš šta_god, a istovremeno ne dolazi do preklapanja imena. Možeš naravno da koristiš i using direktivu, ali onda moraš da vodiš računa da tada ne dođe do problema koji upravo imaš. Preklapanje imena nije poželjno.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
31.176.195.*



Profil

icon Re: Konfuzija oko using namespace i namespacea generalno14.10.2011. u 11:08 - pre 152 meseci
Razumijem to, ali me prvenstveno zanima ovdje u kodu koja je razlika ako idem using xxx:aa; i using namespace xxx;

Znači, zanima me zar on ne "prekopira" sve definicije iz određenog namespacea kada koristim drugi slučaj, pa samim tim uključen je i objekat aa kojeg ne dozvoljava samog uključiti.
 
Odgovor na temu

grabber
Gorazde

Član broj: 213110
Poruke: 172
31.176.195.*



Profil

icon Re: Konfuzija oko using namespace i namespacea generalno14.10.2011. u 11:49 - pre 152 meseci
edit: mislim da sam razumio, direktiva napravi raspoloživim sve definicije i objekte iz namespacea u scopeu u kojem je napisana - NE DEKLARIŠE NIŠTA, a deklaracija na tom mjestu deklariše funkciju/klasu/objekat, pa to stvara konflikt.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Konfuzija oko using namespace i namespacea generalno

[ Pregleda: 1678 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.