在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文件中的实现分开,但我希望所有内容都在同一名称空间中。
答案 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