2014-07-12 3 views
1

En C#, il est simple de placer toutes les classes dans un espace de noms unique. Je comprends comment un espace de noms fonctionne en C++ à un niveau simple. Mais quand vient le temps de rassembler plusieurs fichiers pour apparaître comme un espace de noms, je suis vraiment confus. Il est quelque chose comme ceci possible:comment envelopper plusieurs fichiers dans le même espace de noms en C++

/* NetTools.cpp 
blade 7/12/2014 */ 
using namespace std; 
using namespace NetTools; 
#include "NetTools.h" 

int main() 
{ 
    cout << "testing" << endl; 
    return 0; 
} 
//####### EOF 

/* NetTools.h 
blade 12/7/2014 */ 

#ifndef NETTOOLS_H 
#define NETTOOLS_H 

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <cmath> 

namespace NetTools 
{ 

} 

#endif 
// #### EOF 

/* Commands.h 
blade 7/12/2014 */ 

#include "NetTools.h" 
#ifndef COMMANDS_H 
#define COMMANDS_H 

namespace NetTools 
{ 

} 

#endif 
// ###### EOF 

Je sépare chaque déclaration de classe dans son .h et la mise en œuvre dans son fichier cpp, mais je veux que tout soit dans le même espace de noms.

+3

Si vous mettez des déclarations apparaissant dans différents fichiers d'en-tête dans le même espace de noms, elles le partageront. Je ne comprends pas quel est votre problème réel. Notez également, vous devriez inclure des choses dans vos gardes d'inclusion, pas dehors. –

Répondre

3

Ce que vous avez montré fonctionne très bien. Une propriété fondamentale des espaces de noms est que si différents fichiers déclarent tous des choses dans un espace de noms avec le même nom, le compilateur/éditeur de liens sait mettre les choses ensemble pour obtenir un espace de noms contenant tout ce qui est défini dans tous les fichiers .

Par exemple:

// file a 
namespace A { 
    class X; 
} 

// file b 
namespace A { 
    class Y; 
} 

// file c 
namespace A { 
    class Z; 
} 

... est essentiellement équivalente à:

// one file 
namespace A { 
    class X; 
    class Y; 
    class Z; 
} 

L'exception à cette règle est namespaces anonyme. Les espaces de noms anonymes sont séparés par fichier. Par exemple:

// file a 
namespace { 
    void f(); 
} 

// file b 
namespace { 
    int f(); 
} 

Ces fichiers ne sont pas en conflit car chaque fichier possède son propre espace de noms anonyme unique.

+0

Je pense ici que "fichiers" doit être lu comme "unités de traduction", comme le f() dans l'espace de noms sans nom dans le fichier a et le fichier b déclarent la même fonction lorsque le fichier a et le fichier b sont #include dans le même unité de traduction. –

2

Ce que vous faites est correct. Il y a un problème avec votre code ici si:

/* NetTools.cpp 
blade 7/12/2014 */ 
using namespace std; 
using namespace NetTools; // put this AFTER #include "NetTools.h" 
#include "NetTools.h" 

int main() 
{ 
    cout << "testing" << endl; 
    return 0; 
} 

Il travaille pour using namespace std;(ne sais pas pourquoi) mais il ne fonctionnera pas pour vous namespaces Declare. Le compilateur doit les voir avant vous pouvez commencer using les:

/* NetTools.cpp 
blade 7/12/2014 */ 
#include "NetTools.h" 

using namespace std; 
using namespace NetTools; // now this should work 

int main() 
{ 
    cout << "testing" << endl; 
    return 0; 
} 

Sidenote:

Vous devriez vraiment mettre tout intérieur include garde:

/* Commands.h 
blade 7/12/2014 */ 

#include "NetTools.h" // this should really go after the include guards 
#ifndef COMMANDS_H 
#define COMMANDS_H 

namespace NetTools 
{ 

} 

#endif 

Il est pas besoin de #include "NetTools.h" deux fois (même si elle est protégée).

/* Commands.h 
blade 7/12/2014 */ 

#ifndef COMMANDS_H 
#define COMMANDS_H 

#include "NetTools.h" // like this 

namespace NetTools 
{ 

} 

#endif 
Questions connexes