01. maj 2003 - 22:28Der er
7 kommentarer og 1 løsning
Tutorial til "using namespace std;"
Daw eksperter
Som så mange andre har jeg lært at bruge .h filerne og undlade "using namespace std;"
Nu vil jeg til at bruge det.............
Jeg har kun en svag fornemmelse af hvad "using namespace std;" bruges til og vil derfor gerne have nogle links til nogle gode tutorials der beskriver dens brug. (De må også gerne indeholde andre ting det er bare den jeg primært vil lære AT BRUGE)
Hvis der er tale om ny kode, så bør du så vidt muligt undgå using namespace. Problemet med using namespace er at det går totalt modsat formålet med namespaces.
Namespaces er indført for at gøre det muligt at have to forskellige libraries med samme symboler (eksempelvis std::vector og some_vendor::matrix::vector, hvor navnet vector kan bruges på to inkompatible måder). Så at hive disse navne ind i det globale namespace med using namespace er ikke nogen god ide. Det *kan* bruges i forbindelse med en port, men med ny kode bør det undgås.
Så er der stadig problemet med at man så skal skrive std::string hver gang man vil have gang i en string. Det er lidt træls. Men det kan faktisk klares uden using namespace:
#include <string> using std::string; int main() { string some_string; return 0; }
Her angiver du med using std::string at du gerne vil hive std::string ind i det globale namespace. Så ved oversætteren at når du skriver string mener du std::string. I eksemplet før med vector ville du nok bruge
#include <vector> #include <some_vendor_matrix.h> using std::vector; int main() { vector my_vec; // STL vector some_vendor::matrix::vector my_matvec; // Matrix vector }
Lad os nu et øjeblik antage at some_vendor_matrix.h er lavet uden brug af namespaces, men globalt definerer en vector. Så vil følgende kode ikke oversætte:
Ser ud til at det er en del mere betydningsfuld end jeg først antog... Hvad siger i andre til olennert's holdning (ik fordi jeg ikke tror på dig men det er rart at høre andres meninger)
Arne, jeg kan godt lide det du skriver med kvaje-bajer :-).
Men problemet kan være svært at undgå hvis du eksempelvis får fingrerne i et fem år gammelt library til matrix-regning, lavet før der var noget der hed namespaces, og hvor den der har kodet det har lavet en vector-klasse. Den er så ikke i sit eget namespace, hvorfor brug af using namespace std; vil fejle.
Fordelen ved using std::vector (og using std::string og så videre) er at du eksplicit skriver hvad du ønsker. Så selvom du skal skrive flere linier i forhold til bare at bruge using namespace std; så er det efter min mening det værd.
Men det er meget et spørgsmål om stil. Grunden til at jeg startede med at undgå using namespace er noget som Bjarne skriver i "The C++ Programming Language", third edition, 8.2.9.1: I consider nonlocal using-directives primarily a transition tool. Med mere forklaring i 9.2.4.
Det gav lidt stof til eftertanke så jeg tror jeg går i gang med at RTFM og lære namespaces lidt bedre at kende ( hader at give kvajebajer :) )
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.