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;
}