Di C ++, apa itu "namespace alias"?

156

Apa itu "namespace alias" di C ++? Bagaimana ini digunakan?

Martin B
sumber

Jawaban:

186

Alias ​​namespace adalah cara mudah untuk merujuk ke nama namespace yang panjang dengan nama lain yang lebih pendek.

Sebagai contoh, katakan Anda ingin menggunakan vektor numerik dari Boost's uBLAS tanpa using namespacearahan. Menyebut namespace lengkap setiap kali merepotkan:

boost::numeric::ublas::vector<double> v;

Sebagai gantinya, Anda dapat mendefinisikan alias untuk boost::numeric::ublas- katakanlah kami ingin menyingkat ini menjadi hanya ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;
Martin B
sumber
7
Untuk menjelaskan kemungkinan downvotes, SO tidak dan tidak akan pernah menjadi pengganti untuk buku teks C ++ yang bagus. Pertanyaan yang Anda ajukan akan dijawab oleh buku seperti itu. Dan "fitur" SO untuk menjawab pertanyaan Anda sendiri tidak boleh digunakan untuk memberikan parafrase dari buku-buku tersebut.
24
Jangan tersinggung ... Hanya untuk menjelaskan mengapa saya melakukan ini: Adalah pemahaman saya dari komentar Joel di podcast bahwa bahkan pertanyaan "entry-level" adalah permainan yang adil di SO, dan bahwa dapat diterima untuk mengajukan pertanyaan dan menjawabnya diri sendiri jika konten itu belum di SO dalam bentuk yang dapat diakses. Tapi ternyata, ini disukai?
Martin B
1
Tentu ada etiket untuk menjawab pertanyaan Anda sendiri, untuk menghindari iritasi; dalam kasus ini, itu sangat jelas bahwa itu tidak pernah adalah pertanyaan nyata. Sebagai contoh, stackoverflow.com/questions/494927/…
Marc Gravell
6
@ Martin B: Saya tidak setuju bahwa ini adalah pertanyaan tingkat pemula - sebenarnya ada banyak pertanyaan yang lebih jelas ditanyakan di masa lalu sekarang dengan banyak suara. Karena itu, orang mungkin merasa Anda hanya berusaha mendapatkan reputasi untuk diri sendiri. Caranya adalah dengan menandai satu atau kedua pertanyaan / jawaban sebagai "komunitas wiki". Secara pribadi saya akan menjawab pertanyaan Anda dan menjawab sebagai komunitas. Jika pertanyaan memiliki merrit maka Anda akan mendapatkan ROI.
Richard Corden
1
Saya pikir pertanyaan penting adalah apakah pertanyaan itu nyata "- apakah itu sesuatu yang telah Anda tanyakan? Apakah itu sesuatu yang orang ingin tahu? Apakah itu sesuatu yang belum ditanyakan dan dijawab pada SO? Jika Anda membaca posting blog SO tentang komunitas R memposting dan menjawab pertanyaan di sini, perhatikan bahwa mereka memilih pertanyaan X teratas yang benar-benar ditanyakan oleh komunitas mereka , sehingga memiliki relevansi di dunia nyata. Mengambil cuplikan acak pengetahuan khusus bahasa dan mempostingnya di sini tampaknya kurang bermanfaat.
jalf
7

Sederhananya, #define tidak akan berfungsi.

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

Kompilasi baik-baik saja. Memungkinkan Anda bekerja di sekitar tabrakan namespace / nama kelas.

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

Pada baris terakhir, "Hmm: Ups" adalah kesalahan kompilasi. Pra-prosesor mengubahnya menjadi Tidak :: Ups, tetapi Tidak sudah merupakan nama kelas.

pengguna2168377
sumber
3
Apa yang #define? Mungkin jawaban Anda mengacu pada versi pertanyaan sebelumnya?
einpoklum
3

Lebih lanjut tentang topik ini http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

Ini semua tentang memilih alias untuk nama namespace looong, seperti:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

Lalu nanti, Anda bisa mengetik

typedef SHORT::mytype

dari pada

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

Sintaks ini hanya berfungsi untuk ruang nama, tidak bisa menyertakan kelas, tipe setelah namespace NAME =

Kiriloff
sumber
3

Juga perhatikan bahwa alias namespace dan menggunakan arahan diselesaikan pada waktu kompilasi, bukan waktu berjalan. (Lebih khusus, mereka berdua alat yang digunakan untuk memberitahu kompilator ke mana lagi harus mencari ketika menyelesaikan nama, jika tidak dapat menemukan simbol tertentu dalam lingkup saat ini atau salah satu dari lingkup induknya.) Misalnya, tidak satu pun dari ini akan menyusun:

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

Sekarang, pikiran yang ingin tahu mungkin telah memperhatikan bahwa constexprvariabel juga digunakan pada waktu kompilasi, dan bertanya-tanya apakah mereka dapat digunakan bersama dengan alias atau arahan. Setahu saya, mereka tidak bisa, meskipun saya mungkin salah tentang ini. Jika Anda perlu bekerja dengan variabel bernama identik dalam ruang nama yang berbeda, dan memilih di antara mereka secara dinamis, Anda harus menggunakan referensi atau petunjuk.

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

Kegunaan di atas mungkin terbatas, tetapi harus melayani tujuan.

(Permintaan maaf saya untuk kesalahan ketik yang mungkin saya lewatkan di atas.)

Justin Time - Pasang kembali Monica
sumber
0

Namespace digunakan untuk mencegah konflik nama.

Sebagai contoh:

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

Anda sekarang memiliki dua bilah nama kelas, yang sama sekali berbeda dan terpisah berkat namespace.

"Using namespace" yang Anda tampilkan adalah agar Anda tidak harus menentukan namespace untuk menggunakan kelas di dalam namespace itu. yaitu std :: string menjadi string.

sumber saya: https://www.quora.com/What-is-namespace-in-C++-1

mai
sumber