使用带有翻译单元的声明在命名空间内部或外部使用的位置?

时间:2012-04-25 07:38:52

标签: c++ namespaces

我读到了名称空间here,但没有找到答案..

例如:

// example1.cpp
#include "example1.h"
#include <set>

namespace MyNamespace
{
    using std::set;

    void f() {};
}



// example2.cpp
#include "example2.h"
#include <set>

using std::set;

namespace MyNamespace
{
    void f() {};
}

两个例子abowe都位于x?翻译单位,我的项目正在namespace MyNamespace 我有一个感觉,第二个例子更好,但不知道为什么,因为我在其他翻译单元中看不到导入的名称std::set?那么为什么我要打扰在Mynamespace之外或之内调用using std::set

你能解释一下吗? 另外,在std::setMynamespace会导入#include<set>吗?你怎么知道的?

修改

假设abowe示例是相同项目的cpp文件,在 MyNamespace 内部或外部导入 std :: set 是等效的,因为其他cpp文件(在相同的命名空间)无论如何都不会看到名称集(即使你{{1}}并使用命名空间MyNamespace 键入,也没有效果。你必须使用std :: set键入在每个translatin单位如果你想使用set我是对的,为什么?

3 个答案:

答案 0 :(得分:2)

请记住,在C ++中,不同的源文件通常会产生不同的翻译单元

非正式地,翻译单元是包含文件的结果,您可以使用-E(使用gcc和clang)来观察它以转储预处理的输出。

现在,翻译单元在编译阶段彼此独立。所以无论你在其中一个中做什么都对其他人没有任何影响。这显然适用于using指令。

当然,有标题文件可以帮助您分享。

要明确:

// foo.hpp
#include <set>

namespace Foo { using std::set; }

// foo.cpp
#include "foo.hpp"

namespace Foo {
    using std::swap;

    // both set and swap are accessible without further qualification
}

// bar.cpp
#include "foo.hpp"

namespace Foo {

    // set is accessible without further qualification, swap is not.

}

应该注意,最好在全局命名空间中引入名称。是新类型,函数,typedef还是通过using指令。这样你就可以避免冲突:)

答案 1 :(得分:1)

首先将符号名称std::set仅导入Mynamespace,同时,执行 第二个将它导入到写入using声明的当前命名空间(这恰好是所示示例中的全局范围)。

您应该对编写using指令的位置感到困扰,因为符号名称只会在编写它的当前命名空间中导入,并且在其他范围内不可见。

我不明白问题的一部分,此时std::set将被导入,这与究竟是什么有关?

答案 2 :(得分:0)

在第一个示例中,std :: set中的对象,类和方法可以在命名空间(MyNamespace)中显式访问。

然而,在你的第二个例子中,std :: set中的对象,类和方法在任何地方都是明确可用的(在MyNamespace内外)

一个例子,用伪代码(不要搞错)

//exmaple1.cpp
//includes here

using namespace std;

namespace MyNamespace {
  //an example using cout
  //you can call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

namespace MyOtherNamespace
{
  //an example using cout
  //you can still call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

//example2.cpp
//includes here

namespace MyNamespace {
  using namespace std;
  //an example using cout
  //you can call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

namespace MyOtherNamespace
{
  //an example using cout
  //you can't call cout here explicitly, because it has only
  //been defined in MyNamespace
  std::cout << "Some text to print to screen << std::endl;
}

我希望有帮助