"using" namespace和声明namespace有什么区别?

3

有人能告诉我什么是两者之间的区别吗?

using namespace android;
    .... 

并且
namespace android {
    ....
}

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

2
你需要了解 C++ 命名空间的工作原理以及它们的作用。 - Adrian Cornish
抱歉,我对C++还很陌生,只知道“using namespace xxx”。感谢您的评论,我会更多学习这方面的知识。谢谢。 - Bohan Lu
1
酷啊,Bohan Lu - 我们所有人都是从某个地方开始的 - 我的建议是尽可能多地学习,并提出非常具体的问题。此外,iammilind写了一个很好的答案。 - Adrian Cornish
好的,我明白了。感谢Adrian、iammilind和Gary的回答和建议。下次我会更注意提问。祝你们有愉快的一天。 :-) - Bohan Lu
2个回答

6
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指令可以在函数作用域/命名空间作用域/全局作用域中使用;但是不允许在类作用域中使用:为什么"using namespace X;"不允许在类/结构体层级内部使用?

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

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

顺便提一下,如果在全局范围内(即在 main() 函数之前)声明了 using namespace android;,则在 Bar() 函数中也可以无需使用 :: 直接访问 foo()


谢谢你,iammilind。我对C++真的很陌生,感谢你详细的解释和善意。我会更加努力学习它,再次感谢。 - Bohan Lu

2

如果您对Java有更多的经验,我的答案可能会有所帮助。我猜想,由于您正在进行Android开发,这种情况可能是存在的。

以下意味着您在命名空间android中声明了一个名为MyClass的类。该类的限定名称将是android::MyClass

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

这可以类比于Java代码:

package android;

public class MyClass {...}

以下内容表示,假设已经导入相关类或函数,你可以直接使用android命名空间中定义的类、函数等,而不需要使用其完整限定名称。
using namespace android;

这是一个HTML标签。
#include <path/to/MyClass.h>
using namespace android;

可以类比于Java代码:

import android.MyClass;

谢谢你,Gary。是的,我正在做Android相关的工作。我只熟悉C和Java,不熟悉C++。感谢你的解释,现在我明白了它们之间的区别。谢谢。 - Bohan Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接