07. oktober 2014 - 12:22Der 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?
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.
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
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.
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)
Synes godt om
Ny brugerNybegynder
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.