使用指令

关键字 using 有三种口味。结合关键字命名空间,你可以编写使用指令

如果你不想在命名空间 Foo 中的每个东西前面写 Foo::,你可以使用 using namespace Foo;Foo 导入每一个东西。

namespace Foo
{
    void bar() {}
    void baz() {}
}

//Have to use Foo::bar()
Foo::bar();

//Import Foo
using namespace Foo;
bar(); //OK
baz(); //OK

也可以在命名空间而不是整个命名空间中导入所选实体:

using Foo::bar;
bar(); //OK, was specifically imported
baz(); // Not OK, was not imported

需要注意的是:在大多数情况下,头文件中的 using namespaces 被视为坏风格。如果这样做,则会在包含标头的每个文件中导入名称空间。由于没有“un-using”命名空间,这可能导致命名空间污染(全局命名空间中更多或意外的符号),或者更糟糕的是冲突。有关问题的说明,请参阅此示例:

/***** foo.h *****/
namespace Foo
{
    class C;
}

/***** bar.h *****/
namespace Bar
{
    class C;
}

/***** baz.h *****/
#include "foo.h"
using namespace Foo;

/***** main.cpp *****/
#include "bar.h"
#include "baz.h"

using namespace Bar;
C c; // error: Ambiguity between Bar::C and Foo::C

一个 using 指令不能在类范围内发生。