Avatar billede bvirk Guru
07. oktober 2014 - 12:22 Der er 4 kommentarer og
1 løsning

Hvorfor namespaces i c++

Pludselig slår det mig hvor overdekoreret namespace mekanismen i c++ er.
Som bekendt ligger biblioteksfunktioner i namespace std og man har valget mellem en 'using namespace std' linie i hver *.cpp fil eller prefikse med 'std::'
Er det blot navnesammenfalds risiko, der har afstedkommet vedtagelse af namespaces?
Globale variabler, er jo ikke mere globale end den enkelte fil medmindre de explicit er gjort eksterne.
Hvad er det jeg overseer?
Avatar billede segmose Nybegynder
07. oktober 2014 - 12:48 #1
Udover den (store) navne sammenfald risiko, så lettes kompileren's  opgaver også ved at den ikke behøver søge i namespaces der ikke er inkluderet.

Hvis kompileren kan udelukke store dele af det inkluderede ved template instantiering kan der potentielt spares noget tid. Om nogen kompiler gør det sådan kan jeg desværre ikke svare på.

Så lang tid du ikke skriver 'using namespace std' ind i nogen header så kommer du ikke alt for galt afsted.
At skrive det i en .cpp fil er ikke så galt, men du udelukker så alle navne sammenfald.
Hvis du istedet skriver
using std::cout;
og så bruger cout går det nemt hvis du vil bruge en anden cout med noget test, f.ex. ændre det til
using test::cout;

Sammenfald risikoen er specielt stort når man bruger 3rd parts biblioteker på store projekter, og ikke trivielle enkelt mands projekter.
Avatar billede bvirk Guru
07. oktober 2014 - 15:13 #2
Tak for svar - tænker blot på sproget muligheder.
Sidste sætning ledte mig hen til hvad jeg overså - at namespace kontruktionen ikke er for at modularisere i den samlede mængde af cpp linier i et programmeringsprojekt(i scope mæssigt forstand), men for at kunne differentiere mellem biblioteksfunktioner der inkluderes i samme cpp fil og deres navnesammenfald med noget i denne cpp fil

Såden set meget fleksibelt!
Avatar billede arne_v Ekspert
07. oktober 2014 - 15:48 #3
Det er et krav i et moderne programmerings sprog at understoette namespaces/packages.

De fleste store projekter bruger idag masser af forskellige 3. parts biblioteker. Uden namespaces vil navne konflikter vaere naesten uundgaaelige.

Og de fleste andte sprog har det ogsaa:

UML packages
Java packages
C# og VB.NET namespaces
PHP namespace
etc.
Avatar billede segmose Nybegynder
07. oktober 2014 - 17:16 #4
De folk der laver standarden er fra firmaer der laver noget af de mest komplicerede software, Google, Facebook, Microsoft etc. Dette gør at de ved hvilke vanskeligheder der er når man ikke har namespaces.
Avatar billede bvirk Guru
11. oktober 2014 - 11:28 #5
Svaret må være: fordi compileringsenheder (cpp filer) ellers blot deler til en fællespulje (global namespace)

Eksempel på sprog hvor det er løst anderledes - javascript serverside - Node.js

Filen x.js:
  var wl = require("./p");
  wl.p(__dirname);

Filen p.js
  function p(mes) { console.log(mes); }
  exports.p=p;

Brug af reference 'wl' på anvendelsetidspunktet overflødiggør forud navneidentitet på moduler ( i navnekonfliktmæssig forstand)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester