有人可以告诉我
之间有什么区别using namespace android;
....
和
namespace android {
....
}
我发现Android源代码中的几乎所有.cpp文件都使用第二个.c
另外,如果我想在我自己的项目中包含一些使用第二种文件的文件,我是否也需要使用namespace android{...}
?
因为如果我不这样做,编译器会在调用包含文件的方法时报告错误。或者我需要在方法调用之前添加任何前缀吗?
答案 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;