Newsgroup: it.comp.lang.c++
Titolo: Significato di namespace

Ciao a tutti ....
sto analizzando un sw scritto in C++.
Non riesco, però, a capire il significato della direttiva "namespace" che
talvolta viene
usata nei file ".h".
Qualcuno di voi può aiutarmi suggerendomi link a siti web o libri che mi
permettano di approfondire l'argomento ?
Grazie in anticipo
EV

 usata nei file ".h".
è uno "spazio nomi"
cioè un pezzo di codice (un insieme di funzioni, costanti e altro) i quali
sono accessibili solo mettendo il nome del namespace davanti ai nomi.
esempio:
namespace FunzioniMatematiche {
    int max(int a, int b) { ... }
    int log(...) { .... }
    ...
};
per richiamare una delle funzioni definite nel namespace dovrò scrivere:
x = FunzioniMatematiche::max(45, 65);
uppure scrivere:
using FunzioniMatematiche::max;
using FunzioniMatematiche::...;
x = max(65, 87);
oppure:
using namespace FunzioniMatematiche;
per importare tutto il namespace FunzioniMatematiche nel namespace globale
inoltre il namespace può sostituire la parola chiave 'static', se ne viene
utilizzato uno anonimo:
namespace {
    int x;
    bool bFlag;
};
spero di aver detto tutto correttamente :)
--
ciao
XAERO [*]
"Se vuoi renderti conto del valore del
denaro, prova a chiedere un prestito"
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCA/CM/CS/CC/E/O d?(-) s+:-- a--->? C++++(+)$@ UL-(--) P>++ L+() E-- W+++$@
N++@ o-- K- w+++(++++)@ O--- M V? PS+++ PE-(--) Y? PGP>++ t? 5? X+ R- tv-
b+(++) DI? D++ G- e !h !r y?
------END GEEK CODE BLOCK------

usata nei file ".h".
Un namespace è uno "spazio" per inserire definizioni di variabili, funzioni
o quant'altro in modo da poter suddividere lo scope globale evitando
situazioni di ambiguità per il linker oppure per questioni di leggibilità e
di praticità per il programmatore stesso.
Es:
namespace A {
       int a = 10;
       int funzione();
}
int a::funzione() { // code }
Dato che ogni definizione all'interno del namespace è legata allo scope
dello stesso non si può fare riferimento agli "oggetti" in esso contenuti
semplicemente con il nome, bensi utilizzare il risolutore di scope:
int b = A::a;
Nel qual caso che tu voglia farvi riferimento solo con il nome, allora devi
anteporre al suo utilizzo l'istruzione using:
using A::a;
int b = a;
Credo che nei sorgenti da te citati vi sia anche la seguente istruzione:
using namespace NomeNamespace;
Tale istruzione ha significato analogo a quella appena vista, l'unica
differenza è che esporta tutte le definizioni fatte all'interno del
declaration blocc del namespce. 
Ecco i "tre comandamenti" dei namespace:
1) Due namespace con lo stesso nome vengono fusi assieme
2) La sintassi "namespace id1 = id2" crea un alias per un namespace.
3) Un namespace senza nome racchiude definizioni visibili automaticamente
al di fuori dello stesso, ma legate al modulo stesso in cui il namespace è
definito, quindi non utilizzabili in altri sorgenti.
 
Esistono anche altre regole sul loro utilizzo che puoi trovare sul manuale
di Paolo Marotta su 
www.programmazione.it
 nella sezioni linguaggi.
Non so se il tuo compilatore lo permette, ma quello che utilizzo fornisce
una nota dicendo che internamente il compilatore modifica:
namespace A {
   int a, b;
}
in 
namespace A {
     static int a,b;
}
per rendere eplicito che le definizioni in esso contenute appartengono al
namespace stesso.
Cmq ribadisco che non sono del tutto sicuro che sia standard. Personalmente
non vedo l'utilità, ma ci sono tante altre cose che non approvo nel
linguaggio.
Spero di esserti stato utile.
-- 
La classifica dei prodotti MS:
C#, la migliore barzelletta di Bill Gates.
Visual C++, il meno standard dei compilatori C++.
J++, la copiatura più riuscita.
Windows, il più instabile.
Visual Basic, un esempio di prodotto decente della MS - forse l'unico -.
OutlookExpress, scandali su scandali.
La classifica degli "amici" coglioni:
Stefano Zanchi, il miglior lamer del mondo.
 

permettano di approfondire l'argomento ?
Il testo "Thinking in C++" di Bruce Eckel (liberamente scaricabile da
www.mindview.net
) contiene la trattazione dei namespace nel capitolo
10 intitolato "Name Control".
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

Scusate, ma i namespace in pratica equivarrebbero a
delle classi quindi... classi che non modellano un oggetto
ma raggruppano una serie di funzionalità, giusto?


};
chiaramente sostituisce static solo nei casi in cui static è usata nel
senso di linkage interno, non negli altri.
Inoltre è preferibile usare un namespace anonimo perchè consente anche
di dichiarare classi con linkage interno al modulo corrente:
namespace {
	class X { };
}
mentre non è possibile scrivere
static class X { };
Anto
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.44, higher than 97% of all previous test takers.
Visual Basic 5: 3.06, higher than 77% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688