Namespaces
Με τα Namespaces μπορούμε να αποφύγουμε λάθη (conflicts) που προκύπτουν από συναρτήσεις που μπορεί να έχουν το ίδιο όνομα και ανήκουν σε διαφορετικές βιβλιοθήκες.
Έστω η βιβλιοθήκη a.hpp
.
swapNumbers() { ... } printTable() { ... }
Και η βιβλιοθήκη b.hpp
.
swapNumbers() { ... } getNumber() { ... }
Αν κάνω include την βιβλιοθήκη a.hpp
και την βιβλιοθήκη b.hpp
, επειδή υπάρχει και στις δύο η συνάρτηση swapNumbers() {...}
, θα προκύψει λάθος.
Για να αποφύγουμε τέτοια λάθη "περνάμε" τις συναρτήσεις των βιβλιοθηκών σε ένα namespace γράφοντας τις συναρτήσεις όπως παρακάτω.
Για την βιβλιοθήκη a.hpp
namespace hello { swapNumbers() { ... } printTable() { ... } }
Όπου hello
ένα τυχαίο όνομα με το οποίο προσδιορίζουμε το namespace.
Και για την βιβλιοθήκη b.hpp
namespace world { swapNumbers() { ... } getNumber() { ... } }
Όπου world
ένα τυχαίο όνομα με το οποίο προσδιορίζουμε το namespace.
Όταν μία συνάρτηση βρίσκεται σε namespace, τότε η κλήση της πρέπει να γίνεται με το πρόθεμα του namespace όπως παρακάτω:
#include "a.hpp" #include "b.hpp" int main() { ... hello::swapNumbers(); ... world::swapNumbers(); ... return 0; }
Στο παραπάνω παράδειμα η hello::swapNumbers()
καλείται από την βιβλιοθήκη a.hpp
όπου έχει δηλωθεί το namespace hello
ενώ η world::swapNumbers()
από την βιβλιοθήκη b.hpp
.
Αν στο αρχείο με τη main()
προσθέσουμε την εντολή using namespace
για την βιβλιοθήκη έστω a.hpp
, τότε δεν χρειάζεται το πρόθεμα με το namespace και έτσι ο παραπάνω κώδικας μπορεί να γραφτεί όπως:
#include "a.hpp" #include "b.hpp" using namespace hello; int main() { ... swapNumbers(); ... world::swapNumbers(); ... return 0; }