如何在C ++中将多个文件包装到同一个命名空间中

时间:2014-07-12 10:39:41

标签: c++ c++11 namespaces preprocessor-directive

在C#中,将所有类放入一个唯一的命名空间很简单。我理解命名空间如何在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

我将.h文件中的每个类声明与其cpp文件中的实现分开,但我希望所有内容都在同一名称空间中。

2 个答案:

答案 0 :(得分:3)

你所展示的作品很好。

命名空间的一个基本属性是,如果不同的文件都在具有相同名称的命名空间中声明事物,则编译器/链接器知道将事物放在一起,因此您将获得一个包含所有文件中定义的所有内容的命名空间。

例如:

// file a
namespace A {
    class X;
}

// file b
namespace A {
    class Y;
}

// file c
namespace A {
    class Z;
}

...大致相当于:

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

这是一个例外的匿名命名空间。匿名命名空间按文件分隔。例如:

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

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

这些不会发生冲突,因为每个文件都有自己唯一的匿名命名空间。

答案 1 :(得分:2)

你在做什么是正确的。这里的代码存在问题:

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

适用于using namespace std; (不确定原因),但它不适用于声明的命名空间。编译器需要在之前看到它们,你可以开始using它们:

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

<强>旁注:

你应该把所有放在包含守卫中:

/* 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

无需#include "NetTools.h"两次(即使它包含受保护的内容)

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

#ifndef COMMANDS_H
#define COMMANDS_H

#include "NetTools.h" // like this

namespace NetTools
{

}

#endif