2

誰かが私に何が違うのか教えてもらえますか

using namespace android;
    .... 

namespace android {
    ....
}

Android ソース コードのほとんどすべての .cpp ファイルが 2 番目のファイルを使用していることがわかりました。
また、自分のプロジェクトで 2 番目のタイプを使用するファイルをいくつか含めたい場合、私も使用する必要がありnamespace android{...}ますか?
そうしないと、インクルードされたファイルのメソッドを呼び出すと、コンパイラがエラーを報告するためです。または、メソッド呼び出しの前にプレフィックスを追加する必要がありますか?

4

2 に答える 2

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

-- は、特定の名前内の変数と関数のスコープに使用されます。これらの変数/関数を使用/呼び出している間は、スコープ解決演算子を使用して::ください。例えば

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

namespaceすべての宣言を 1 つの body インスタンスに入れることに制限はありません。複数namespace androidのファイルにまたがる複数の本文が可能であり、推奨される場合もあります。例えば

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

于 2011-10-19T03:32:51.750 に答える
2

私の答えは、Java の経験が豊富な場合にのみ役立つでしょう。あなたがアンドロイドのことをしているので、これが事実だと思います。

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;
于 2011-10-19T03:46:53.227 に答える