Avatar billede gumbert Nybegynder
01. maj 2003 - 22:28 Der 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)


mvh.
  Gumbert
Avatar billede arne_v Ekspert
01. maj 2003 - 22:53 #1
Der er en udmærkert forklaring på:

http://www.cplusplus.com/doc/tutorial/tut5-2.html
Avatar billede tam Nybegynder
01. maj 2003 - 23:18 #2
Her er en masse om STL (som er det du gerne vil bruge)

http://www.codeproject.com/vcpp/stl/#Beginners
Avatar billede olennert Nybegynder
02. maj 2003 - 13:01 #3
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:

#include <vector>
#include <some_vendor_matrix.h>
using namespace std;
int main() {
  vector my_vec; // STL vector
  vector my_matvec; // Matrix vector
}

For at få det til at virke må du køre med

#include <vector>
#include <some_vendor_matrix.h>
int main() {
  std::vector my_vec; // STL vector
  vector my_matvec; // Matrix vector
}

Så pas på med using namespace.
Avatar billede gumbert Nybegynder
02. maj 2003 - 13:37 #4
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)
Avatar billede arne_v Ekspert
02. maj 2003 - 13:45 #5
Det er rigtigt hvad han siger.

Jeg tvivler lidt på, at der er ret mange der gør det på
den måde.

De fleste steder vil den programmør der lavede noget med navne-sammenfald
med std namespace bare skulle give kvaje-bajer.

:-)

Men for optimal udnyttelse af namespace er det nok det rigtige.
Avatar billede olennert Nybegynder
02. maj 2003 - 13:54 #6
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.
Avatar billede arne_v Ekspert
02. maj 2003 - 14:03 #7
Det er iøvrigt ikke kun i C++ at diskussionen findes.

Java folket diskueter også:

import java.util.*;

versus:

import java.util.Map;
import java.util.HashMap;
Avatar billede gumbert Nybegynder
02. maj 2003 - 14:16 #8
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 :) )
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
Kategori
Kurser inden for grundlæggende programmering

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