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

Avril 2018 1 / 11
Introduction

C++

Namespace ?
I c
Un espace de stockage abstrait (n’existe pas
H
ELphysiquement)
U
Un répertoire virtuel L MO
r e E
f des
c h
Conçu pour développer
de conflit deA
structures fonctionnelles sans avoir
c nom

Avril 2018 2 / 11
Problématique

C++
Considérons les quatre fichiers suivants

Fichier salutationFr.h Fichier salutationEn.h

#ifndef SALUTATIONFR_H_INCLUDED #ifndef SALUTATIONEN_H_INCLUDED


#define SALUTATIONFR_H_INCLUDED
c
#define SALUTATIONEN_H_INCLUDED
I
void direBonjour();
ELH
void direBonjour();

U
#endif // SALUTATIONFR_H_INCLUDED

L MO
#endif // SALUTATIONEN_H_INCLUDED

f E
Fichier salutationFr.cpp
Ac hre Fichier salutationEn.cpp

c

#include <iostream>> #include <iostream>

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

void direBonjour() void direBonjour()


{ {
std::cout << "Bonjour" << std std::cout << "Good morning" <<
::endl; std::endl;
} }
Avril 2018 3 / 11
Problématique

C++
Le contenu de la fonction principale main
#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"
I c

using namespace std;
ELH
U
int main()
L MO
f E
hre
{
direBonjour();
c
}
c A

Avril 2018 4 / 11
Problématique

C++
Le contenu de la fonction principale main
#include <iostream>

#include "salutationFr.h"
#include "salutationEn.h"
I c

using namespace std;
ELH
U
int main()
L MO
f E
hre
{
direBonjour();
c
}
c A

En exécutant, le résultat est

multiple definition of ’direBonjour()’

Avril 2018 4 / 11
Problématique

C++

Première solution
Faire include d’un seul fichier

I c

ELH
U
L MO
f E
chre
c A

Avril 2018 5 / 11
Problématique

C++

Première solution
Faire include d’un seul fichier

I c

ELH
U
Mais
L MO
f E
hre
dans certains cas on a besoin d’utiliser les deux
c
c A

Avril 2018 5 / 11
Problématique

C++

Première solution
Faire include d’un seul fichier

I c

ELH
U
Mais
L MO
f E
hre
dans certains cas on a besoin d’utiliser les deux
c
c A

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

Avril 2018 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_INCLUDED #ifndef SALUTATIONEN_H_INCLUDED


#define SALUTATIONFR_H_INCLUDED #define SALUTATIONEN_H_INCLUDED

namespace fr namespace en
{ {
void direBonjour();
c

void direBonjour();
I
}
#endif // SALUTATIONFR_H_INCLUDED
}

ELH
#endif // SALUTATIONEN_H_INCLUDED
U
Fichier salutationFr.cpp
MO
Fichier salutationEn.cpp

#include <iostream>>
f EL #include <iostream>

chre
c A
#include "salutationFr.h" #include "salutationEn.h"

namespace fr namespace en
{ {
void direBonjour() void direBonjour()
{ {
std::cout << "Bonjour" << std::cout << "Good morning"
std::endl; << std::endl;
} }
} }
Avril 2018 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"
I c

using namespace std;
ELH
U
int main()
L MO
{
f E
fr::direBonjour();
c hre
c A
en::direBonjour();
}

Avril 2018 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"
I c

using namespace std;
ELH
U
int main()
L MO
{
f E
fr::direBonjour();
c hre
c A
en::direBonjour();
}

En exécutant, le résultat est

Bonjour
Good morning

Avril 2018 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"
I c

using namespace std;
ELH
U
MO
using namespace fr;

int main()
f E L
{
c hre
c A
direBonjour();

}

en::direBonjour();

Avril 2018 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"
I c

using namespace std;
ELH
U
MO
using namespace fr;

int main()
f E L
{
c hre
c A
direBonjour();

}

en::direBonjour();

En exécutant, le résultat est évidemment le même

Bonjour
Good morning

Avril 2018 8 / 11
Namespaces imbriqués

C++

On peut aussi imbriquer les namespaces (contenu de


salutationEn.h)
#ifndef SALUTATIONEN_H_INCLUDED
#define SALUTATIONEN_H_INCLUDED
I c

ELH
U
MO
namespace en
{
f E L
hre
void direBonjour();
c
c A
namespace us
{
void direBonjour();
}
}
#endif // SALUTATIONEN_H_INCLUDED

Avril 2018 9 / 11
Namespaces imbriqués

C++
Nouveau contenu de salutationEn.cpp
#include <iostream>

#include "salutationEn.h"

I c

namespace en
{
ELH
U
MO
void direBonjour()
{
f E L
std::cout << "Good morning" << std::endl;
}
c hre
c A
namespace us
{
void direBonjour()
{
std::cout << "Good mornin" << std::endl;
}
}
}

Avril 2018 10 / 11
Namespaces imbriqués

C++
Testons tout ça dans le main
#include <iostream>

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

I c

using namespace std;

ELH
int main()
U
{
L MO
direBonjour();
f E
hre
en::direBonjour();

c
en::us::direBonjour();

c A
}

Avril 2018 11 / 11
Namespaces imbriqués

C++
Testons tout ça dans le main
#include <iostream>

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

I c

using namespace std;

ELH
int main()
U
{
L MO
direBonjour();
f E
hre
en::direBonjour();
en::us::direBonjour();
c
c A
}

En exécutant, le résultat est

Bonjour
Good morning
Good mornin

Avril 2018 11 / 11

Vous aimerez peut-être aussi