“using”命名空间和声明命名空间有什么区别?

时间:2011-10-19 03:23:30

标签: c++ namespaces terminology using using-directives

有人可以告诉我

之间有什么区别
using namespace android;
    .... 

namespace android {
    ....
}

我发现Android源代码中的几乎所有.cpp文件都使用第二个.c 另外,如果我想在我自己的项目中包含一些使用第二种文件的文件,我是否也需要使用namespace android{...}? 因为如果我不这样做,编译器会在调用包含文件的方法时报告错误。或者我需要在方法调用之前添加任何前缀吗?

2 个答案:

答案 0 :(得分:6)

namespace android {
  extern int i;  // declare here but define somewhere
  void foo ();
}

- 用于在特定名称中包含变量和函数。在使用/调用这些变量/函数时,请使用范围解析运算符::。 e.g。

int main ()
{
  android::foo();
}

将所有namespace声明放在单个正文实例中没有任何限制。多个namespace android实体可以分布在多个文件中,有时也可以推荐。 e.g。

// x.cpp
namespace android {
  void somefunc_1 ();
}

// y.cpp
namespace android {
  void somefunc_2 ();
}

现在,如果频繁使用,有时您会发现使用::运算符不方便,这会使名称不必要地更长。那时可以使用using namespace指令。

using指令可用于函数作用域/命名空间作用域/全局作用域;但class范围内不允许Why "using namespace X;" is not allowed inside class/struct level?)。

int main ()
{
  using namespace android;
  foo(); // ok
}

void bar ()
{
  foo(); // error! 'foo' is not visible; must access as 'android::foo()'
}

BTW,如果using namespace android;全局声明(即main()以上),那么foo()中的::也可以在Bar()内{{1}}进行访问。

答案 1 :(得分:2)

如果您对Java更有经验,我的回答可能会有所帮助。我猜是因为你在做android的事情就是这种情况。

以下表示您在名称空间MyClass中声明了一个名为android的类。该类的限定名称为android::MyClass

namespace android {
    class MyClass {...};
}

它可以被认为与Java代码类似:

package android;

public class MyClass {...}

以下意味着您可以使用android命名空间中定义的类,函数等,而无需使用其限定名称(假设它们已包含在内)。

using namespace android;

#include <path/to/MyClass.h>
using namespace android;

可以被认为与Java代码类似:

import android.MyClass;