3

我在这里阅读了有关名称空间的信息,但没有找到答案。

例如:

// 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() {};
}

上面的两个例子都位于一些 x? 翻译单元,我的项目正在进行中,我觉得第二个例子更好,但不知道为什么,因为我在其他翻译单元namespace MyNamespace 中看不到导入的名称?std::set那么我为什么要打扰我是using std::set在 Mynamespace 外部还是内部调用呢?

你可以解释吗?另外,在什么时候将std::set被导入Mynamespace?你怎么知道?

编辑:

假设上面的示例是同一项目的 cpp 文件,那么在MyNamespace内部或外部导入std::set是等效的,因为其他 cpp 文件(位于同一命名空间中)无论如何都不会看到名称集(即使您输入using namespace MyNamespace,没有效果。如果你想使用 set ,你必须在每个翻译单元中输入 using std::set我是对的,为什么?#include<set>

4

3 回答 3

3

请记住,与 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指令。这样你就可以避免冲突:)

于 2012-04-25T09:27:34.457 回答
1

std::set首先仅将符号名称导入到Mynamespacewhile,
然后将其导入到编写 using 声明的当前命名空间(这恰好是您所示示例中的全局范围)。

您应该为编写 using 指令的位置而烦恼,因为符号名称随后仅在写入它的当前命名空间中导入,并且在其他范围内不可见。

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

于 2012-04-25T07:43:41.680 回答
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;
}

我希望这会有所帮助

于 2012-04-25T07:46:36.957 回答