"namespace alias" ใน C ++ คืออะไร มันใช้งานอย่างไร?
"namespace alias" ใน C ++ คืออะไร มันใช้งานอย่างไร?
คำตอบ:
นามแฝง namespace เป็นวิธีที่สะดวกในการอ้างอิงชื่อเนมสเปซแบบยาวด้วยชื่อที่สั้นกว่าและแตกต่างกัน
ตัวอย่างเช่นสมมติว่าคุณต้องการใช้เวกเตอร์ตัวเลขจาก uBLAS ของ Boost โดยไม่มีusing namespace
คำสั่ง การระบุเนมสเปซเต็มรูปแบบทุกครั้งที่ยุ่งยาก:
boost::numeric::ublas::vector<double> v;
แต่คุณสามารถกำหนดนามแฝงสำหรับboost::numeric::ublas
- ว่าเราต้องการย่อให้เหลือเพียงublas
:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
ค่อนข้าง #define ไม่ทำงาน
namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
รวบรวมดี ให้คุณหลีกเลี่ยงการชนชื่อเนมสเปซ / คลาส
namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }
ในบรรทัดสุดท้าย "อืม: โอ๊ะโอ" เป็นข้อผิดพลาดในการคอมไพล์ ตัวประมวลผลล่วงหน้าเปลี่ยนเป็น Nope :: อ๊ะ แต่ Nope เป็นชื่อคลาสแล้ว
เพิ่มเติมในหัวข้อนี้http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n
ทุกอย่างเกี่ยวกับการเลือกนามแฝงสำหรับชื่อเนมสเปซ looong เช่น:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
จากนั้นในภายหลังคุณสามารถพิมพ์
typedef SHORT::mytype
แทน
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
ไวยากรณ์นี้ใช้งานได้กับเนมสเปซเท่านั้นไม่สามารถรวมคลาสได้หลังจากพิมพ์ namespace NAME =
โปรดทราบว่านามแฝงเนมสเปซและการใช้คำสั่งจะได้รับการแก้ไข ณ เวลารวบรวมไม่ใช่เวลาทำงาน (โดยเฉพาะอย่างยิ่งพวกเขาทั้งคู่เป็นเครื่องมือที่ใช้บอกคอมไพเลอร์ว่าจะต้องดูที่การแก้ไขชื่อหากไม่สามารถหาสัญลักษณ์เฉพาะในขอบเขตปัจจุบันหรือขอบเขตหลักใด ๆ ) ตัวอย่างเช่นสิ่งเหล่านี้จะไม่ รวบรวม:
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;
ตอนนี้จิตใจที่อยากรู้อยากเห็นอาจสังเกตเห็นว่าconstexpr
มีการใช้ตัวแปรในเวลารวบรวมและสงสัยว่าพวกเขาสามารถใช้ร่วมกับนามแฝงหรือคำสั่งได้หรือไม่ สำหรับความรู้ของฉันพวกเขาไม่สามารถแม้ว่าฉันจะผิดเกี่ยวกับเรื่องนี้ หากคุณต้องการทำงานกับตัวแปรที่มีชื่อเหมือนกันในเนมสเปซที่แตกต่างกันและเลือกระหว่างตัวแปรแบบไดนามิกคุณจะต้องใช้การอ้างอิงหรือพอยน์เตอร์
// 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;
}
}
ประโยชน์ที่ได้รับจากข้างต้นอาจถูก จำกัด แต่ก็ควรทำตามวัตถุประสงค์
(คำขอโทษของฉันสำหรับงานพิมพ์ใด ๆ ที่ฉันอาจพลาดในข้างต้น)
Namespace ใช้เพื่อป้องกันความขัดแย้งของชื่อ
ตัวอย่างเช่น:
namespace foo {
class bar {
//define it
};
}
namespace baz {
class bar {
// define it
};
}
ตอนนี้คุณมีแถบชื่อคลาสสองชั้นที่แตกต่างอย่างสิ้นเชิงและแยกจากกันด้วยการกำหนดเนมสเปซ
"การใช้เนมสเปซ" ที่คุณแสดงคือเพื่อให้คุณไม่ต้องระบุเนมสเปซเพื่อใช้คลาสภายในเนมสเปซนั้น ie std :: string กลายเป็นสตริง
ทรัพยากรของฉัน: https://www.quora.com/What-is-namespace-in-C++-1