使用预制命名空间(C ++)进行范围设定

时间:2011-12-13 02:24:08

标签: c++ namespaces include scope

为避免确定STL中的所有内容,您可以输入

using namespace std;

为避免确定范围,您可以输入:

using std::cout;  
using std::cin;

我想写一个行为相同的库。但是,我希望能够包含特定的函数集合,而不是能够包含特定的类。

所以,例如,我编码:

  • 字符串函数的集合
  • 数学函数的集合

它们是同一命名空间的一部分,但我可以包含我想要的块


这是sudo-ish代码,但我认为它得到了我的想法:

namespace Everything{
    namespace StringFunctions{
        void str1(string & str);
        void str2(string & str);
        void str3(string & str);
        void str4(string & str);
        void str5(string & str);
    }

    namespace MathFunctions {
        void math1(int & num);
        void math2(int & num);
        void math3(int & num);
        void math4(int & num);
        void math5(int & num);
    }
}

然后我希望能够做到这样的事情:

#include "Everything.h"
using Everything::Stringfunctions;

int main(){

    str1("string"); //this works, I can call this!
    math1(111);     //compile error: I've never heard of that function!

    return 0;
}

显然这不起作用,我对如何分割我的图书馆感到困惑。我不想让它们成为类,然后必须在任何地方使用“点运算符”,但我也不想包含大量的头文件。

也许我会以错误的方式解决这个问题。我希望每个人都可以帮助我采取正确的方法。


编辑:

通过写作:

using namespace Everything::Stringfunctions;

事后看来,这是非常明显的。

3 个答案:

答案 0 :(得分:3)

在您提供的示例中编写库的方式已足够。

人们可以使用指令Everything::Stringfunctions从命名空间using namespace Everything::Stringfunctions获取每个函数。

答案 1 :(得分:0)

你应该考虑将功能分成不同的标题,否则你最终会遇到噩梦编译时间。这就是说我认为using namespace Everything::Stringfunctions;应该这样做(在那里有额外的namespace。我没有尝试编译)。

答案 2 :(得分:0)

如果您使用using namespace而不仅仅是using,那么您想要的效果似乎有效。见here(程序编译和输出'5')。