我读到了名称空间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::set
处Mynamespace
会导入#include<set>
吗?你怎么知道的?
修改
假设abowe示例是相同项目的cpp文件,在 MyNamespace 内部或外部导入 std :: set 是等效的,因为其他cpp文件(在相同的命名空间)无论如何都不会看到名称集(即使你{{1}}并使用命名空间MyNamespace 键入,也没有效果。你必须使用std :: set键入在每个translatin单位如果你想使用set我是对的,为什么?
答案 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;
}
我希望有帮助