В чем разница между «использованием» пространства имен и объявлением пространства имен? - PullRequest
1 голос
/ 19 октября 2011

Может кто-нибудь сказать мне, в чем разница между

using namespace android;
    .... 

и

namespace android {
    ....
}

Я обнаружил, что почти все файлы .cpp в исходном коде Android используют второй.
Кроме того, если я хочу включить некоторые файлы, которые используют тип второго, в мой собственный проект, нужно ли мне также использовать namespace android{...}?
Потому что, если я этого не сделаю, компилятор сообщит об ошибке при вызове методов включенных файлов. Или мне нужно добавить какой-либо префикс перед вызовом метода?

Ответы [ 2 ]

6 голосов
/ 19 октября 2011
namespace android {
  extern int i;  // declare here but define somewhere
  void foo ();
}

- используется для определения переменных и функций внутри определенного имени. При использовании / вызове этих переменных / функций используйте оператор разрешения области действия ::. например,

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

Нет ограничений на размещение всех объявлений namespace в одном экземпляре тела. Возможно несколько namespace android тел, распределенных по нескольким файлам, возможно, а также иногда рекомендуется. например, * +1008 *

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

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

Теперь, иногда вы можете обнаружить, что использование оператора :: неудобно, если его часто использовать, что делает имена излишне длиннее. В это время можно использовать директиву using namespace.

Эта директива using может использоваться в области действия функции / области имен / глобальной области видимости; Но не допускается в области действия class: Почему "используется пространство имен X;" не допускается внутри уровня класса / структуры? ).

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().

2 голосов
/ 19 октября 2011

Мой ответ, вероятно, будет полезен, только если вы более опытны с 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;
...