Vincent Robert พูดถูกในความคิดเห็นของเขาคุณใช้เนมสเปซใน C ++ อย่างไร .
ใช้เนมสเปซ
Namespaces ถูกใช้อย่างน้อยที่สุดเพื่อช่วยหลีกเลี่ยงการชนกันของชื่อ ใน Java สิ่งนี้ถูกบังคับใช้ผ่าน "org.domain" สำนวน (เพราะมันควรจะไม่ใช้ชื่ออื่นนอกเหนือจากชื่อโดเมนของเขา / เธอ)
ใน C ++ คุณสามารถกำหนด namespace ให้กับรหัสทั้งหมดในโมดูลของคุณ ตัวอย่างเช่นสำหรับโมดูล MyModule.dll คุณสามารถให้รหัส MyModule กับ namespace ได้ ฉันเห็นคนอื่นที่ใช้ MyCompany :: MyProject :: MyModule ฉันเดาว่ามันเกินความจริง แต่โดยรวมแล้วดูเหมือนว่าถูกต้องสำหรับฉัน
ใช้ "ใช้"
การใช้ควรใช้ด้วยความระมัดระวังอย่างยิ่งเนื่องจากจะนำเข้าสัญลักษณ์ (หรือทั้งหมด) อย่างมีประสิทธิภาพจากเนมสเปซไปยังเนมสเปซปัจจุบันของคุณ
นี่เป็นสิ่งที่ผิดในไฟล์ส่วนหัวเนื่องจากส่วนหัวของคุณจะทำให้เกิดมลพิษทุกแหล่งรวมถึงมัน (มันทำให้ฉันนึกถึงมาโคร ... ) และแม้กระทั่งในไฟล์ต้นฉบับสไตล์ที่ไม่ดีนอกขอบเขตของฟังก์ชั่นเพราะมันจะนำเข้าที่ขอบเขตทั่วโลก สัญลักษณ์จากเนมสเปซ
วิธีที่ปลอดภัยที่สุดในการใช้ "การใช้" คือการนำเข้าสัญลักษณ์ที่เลือก:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
คุณจะเห็นจำนวนมาก "ใช้ namespace std;" ในการกวดวิชาหรือรหัสตัวอย่าง เหตุผลคือลดจำนวนสัญลักษณ์เพื่อให้การอ่านง่ายขึ้นไม่ใช่เพราะมันเป็นความคิดที่ดี
"ใช้ namespace std;" Scott Meyers ท้อใจ (ฉันจำไม่ได้ว่าหนังสือเล่มไหน แต่ฉันสามารถหาได้ถ้าจำเป็น)
องค์ประกอบเนมสเปซ
เนมสเปซเป็นมากกว่าแพ็คเกจ อีกตัวอย่างหนึ่งสามารถพบได้ใน "ภาษาโปรแกรม C ++" ของ Bjarne Stroustrup
ใน "รุ่นพิเศษ" ที่8.2.8 องค์ประกอบของเนมสเปซเขาจะอธิบายวิธีที่คุณสามารถผสานสองเนมสเปซ AAA และ BBB เข้ากับอีกหนึ่งชื่อที่เรียกว่า CCC ดังนั้น CCC จะกลายเป็นนามแฝงสำหรับทั้ง AAA และ BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
คุณสามารถนำเข้าสัญลักษณ์ที่เลือกจากเนมสเปซที่แตกต่างกันเพื่อสร้างอินเทอร์เฟซเนมสเปซที่กำหนดเองของคุณเอง ฉันยังไม่พบการใช้สิ่งนี้ในทางปฏิบัติ แต่ในทางทฤษฎีแล้วมันยอดเยี่ยม
std
เนมสเปซกับสัญลักษณ์แทนการใช้using
เลย ดังนั้นฉันมักจะเขียนstd::cout
หรือstd::string
ตอนนี้เพราะนั่นคือสิ่งที่ฉันเรียกพวกเขาตอนนี้cout
ฉันจะไม่เพียงแค่เขียน