Vous êtes sur la page 1sur 17

C++ : espace de noms (namespace)

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 11


Introduction

C++

Namespace ?
H I ©
EL
Espace de stockage abstrait (n’existe pas physiquement)
U
O
Répertoire virtuel
f E LM
ch r e
Conçu pour développer des structures fonctionnelles sans avoir

©A
de conflit de nom

H & H: Research and Training 2 / 11


Problématique

Considérons les quatre fichiers suivants

Fichier salutationFr.h Fichier salutationEn.h

#ifndef SALUTATIONFR_H #ifndef SALUTATIONEN_H


#define SALUTATIONFR_H #define SALUTATIONEN_H

void direBonjour();
I ©
void direBonjour();
H
#endif #endif
UEL
O
f E LM
Fichier salutationFr.cpp

ch r e Fichier salutationEn.cpp

©A
#include <iostream> #include <iostream>
#include "salutationFr.h" #include "salutationEn.h"

using namespace std; using namespace std;

void direBonjour() void direBonjour()


{ {
cout << "Bonjour" << endl; cout << "Good morning" << endl;
} }

H & H: Research and Training 3 / 11


Problématique

C++
Le contenu de la fonction principale main

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

H I ©
using namespace std;
UEL
O
LM
int main()
{
r e f E
ch
direBonjour();

©A
}

H & H: Research and Training 4 / 11


Problématique

C++
Le contenu de la fonction principale main

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

H I ©
using namespace std;
UEL
O
LM
int main()
{
r e f E
ch
direBonjour();

©A
}

En exécutant, le résultat est

multiple definition of ’direBonjour()’

H & H: Research and Training 4 / 11


Problématique

C++

Première solution
Faire include d’un seul fichier

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 5 / 11


Problématique

C++

Première solution
Faire include d’un seul fichier

H I ©
UEL
Mais O
f E LM
ch r e
dans certains cas on a besoin d’utiliser les deux

©A

H & H: Research and Training 5 / 11


Problématique

C++

Première solution
Faire include d’un seul fichier

H I ©
UEL
Mais O
f E LM
ch r e
dans certains cas on a besoin d’utiliser les deux

©A
Deuxième solution
Définir chacune de ses fonctions dans un namespace différent.

H & H: Research and Training 5 / 11


Solution avec les namespaces

Définissons des namespaces dans les quatre fichiers précédents

Fichier salutationFr.h Fichier salutationEn.h

#ifndef SALUTATIONFR_H #ifndef SALUTATIONEN_H


#define SALUTATIONFR_H #define SALUTATIONEN_H

namespace fr namespace en
{
void direBonjour();
{

I ©
void direBonjour();
H
EL
} }

#endif
O
#endif
U
f E LM
Fichier salutationFr.cpp

ch r e Fichier salutationEn.cpp

©A
#include <iostream> #include <iostream>
#include "salutationFr.h" #include "salutationEn.h"

using namespace std; using namespace std;

namespace fr namespace en
{ {
void direBonjour() void direBonjour()
{ {
cout << "Bonjour" << endl; cout << "Good morning" << endl;
} }
} }

H & H: Research and Training 6 / 11


Solution avec les namespaces

C++
Il reste qu’à préciser le namespace au moment de l’appel

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

H I ©
EL
using namespace std;

int main()
O U
{
fr::direBonjour();
f E LM
en::direBonjour();
ch r e
©A
}

H & H: Research and Training 7 / 11


Solution avec les namespaces

C++
Il reste qu’à préciser le namespace au moment de l’appel

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

H I ©
EL
using namespace std;

int main()
O U
{
fr::direBonjour();
f E LM
en::direBonjour();
ch r e
©A
}

En exécutant, le résultat est

Bonjour
Good morning

H & H: Research and Training 7 / 11


Solution avec les namespaces

C++
On peut aussi utiliser l’opérateur using comme pour std

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

using namespace std;


H I ©
using namespace fr;
UEL
O
LM
int main()
{
direBonjour();
r e f E
en::direBonjour();
ch
©A
}

H & H: Research and Training 8 / 11


Solution avec les namespaces

C++
On peut aussi utiliser l’opérateur using comme pour std

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

using namespace std;


H I ©
using namespace fr;
UEL
O
LM
int main()
{
direBonjour();
r e f E
en::direBonjour();
ch
©A
}

Même résultat

Bonjour
Good morning

H & H: Research and Training 8 / 11


Namespaces imbriqués

C++

On peut aussi imbriquer les namespaces (contenu de salutationEn.h)


#ifndef SALUTATIONEN_H
#define SALUTATIONEN_H

H I ©
EL
namespace en
{
O U
LM
void direBonjour();
namespace us
r e f E
ch
{

©A
void direBonjour();
}
}

#endif

H & H: Research and Training 9 / 11


Namespaces imbriqués

C++
Nouveau contenu de salutationEn.cpp

#include <iostream>
#include "salutationEn.h"

using namespace std;

H I ©
EL
namespace en
{
void direBonjour()
O U
{

f
cout << "Good morning" << endl;
E LM
}
ch r e
©A
namespace us
{
void direBonjour()
{
cout << "Good mornin" << endl;
}
}
}

H & H: Research and Training 10 / 11


Namespaces imbriqués

C++
Pour tester

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

using namespace std;


using namespace fr;

int main()
{
direBonjour();
en::direBonjour();
en::us::direBonjour();
}

H & H: Research and Training 11 / 11


Namespaces imbriqués

C++
Pour tester

#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"

using namespace std;


using namespace fr;

int main()
{
direBonjour();
en::direBonjour();
en::us::direBonjour();
}

En exécutant, le résultat est

Bonjour
Good morning

H & H: Research and Training 11 / 11

Vous aimerez peut-être aussi