【问题标题】:What is the difference between "using" namespace and declaring namespace?“使用”命名空间和声明命名空间有什么区别?
【发布时间】:2011-12-10 14:24:13
【问题描述】:

谁能告诉我有什么区别

using namespace android;
    .... 

namespace android {
    ....
}

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

【问题讨论】:

  • 您需要了解 C++ 命名空间的工作原理以及它们的用途。
  • 对不起,我是 C++ 新手,我只知道“使用命名空间 xxx”。感谢您的评论,我会更多地研究它。谢谢。
  • :-)cool Bohan Lu - 所有的使用都从某个地方开始 - 我的建议是尽可能多地学习并提出一个非常具体的问题。 iammilind 也写了一个很好的答案
  • 好的,我明白了。感谢您的回答和建议 Adrian、iammilind 和 Gary。下次我会更加注意提问。祝你今天过得愉快。 :-)

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


【解决方案1】:
namespace android {
  extern int i;  // declare here but define somewhere
  void foo ();
}

-- 用于限定特定名称内的变量和函数。在使用/调用这些变量/函数时,使用范围解析运算符::。例如

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

将所有namespace 声明放在一个主体实例中没有任何限制。多个namespace android 正文分布在多个文件中,这是可能的,有时也建议使用。例如

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

顺便说一句,如果全局声明了using namespace android;(即在main() 之上),那么foo() 也可以在Bar() 中没有:: 的情况下访问。

【讨论】:

  • 谢谢你,iammilind。我对 C++ 很陌生,感谢您的友好和详细的解释。我会进一步研究它,再次感谢。
【解决方案2】:

我的回答可能只有在您对 Java 更有经验时才有帮助。我猜,因为你在做 android 的东西,情况就是这样。

以下表示您在命名空间android 中声明了一个名为MyClass 的类。类的限定名称为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;

【讨论】:

  • 谢谢你,加里。是的,我正在做 Android 的东西。我只熟悉 C 和 Java 而不是 C++。感谢您的解释,所以我现在了解其中的区别。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多