เนมสเปซใน C ++
พิจารณาสถานการณ์เมื่อเรามี Zara สองคนที่มีชื่อเดียวกันในคลาสเดียวกัน เมื่อใดก็ตามที่เราต้องการแยกความแตกต่างอย่างแน่นอนเราจะต้องใช้ข้อมูลเพิ่มเติมพร้อมกับชื่อของพวกเขาเช่นพื้นที่หากพวกเขาอาศัยอยู่ในพื้นที่อื่นหรือชื่อแม่หรือพ่อของพวกเขาเป็นต้น
สถานการณ์เดียวกันอาจเกิดขึ้นในแอปพลิเคชัน C ++ ของคุณ ตัวอย่างเช่นคุณอาจกำลังเขียนโค้ดบางตัวที่มีฟังก์ชันชื่อ xyz () และมีไลบรารีอื่นที่พร้อมใช้งานซึ่งมีฟังก์ชัน xyz () เหมือนกัน ตอนนี้คอมไพเลอร์ไม่มีทางรู้ได้ว่าฟังก์ชัน xyz () เวอร์ชันใดที่คุณอ้างถึงภายในโค้ดของคุณ
ก namespaceได้รับการออกแบบมาเพื่อเอาชนะความยากลำบากนี้และใช้เป็นข้อมูลเพิ่มเติมเพื่อแยกความแตกต่างของฟังก์ชันคลาสตัวแปรและอื่น ๆ ที่คล้ายคลึงกันโดยใช้ชื่อเดียวกันในไลบรารีต่างๆ การใช้เนมสเปซคุณสามารถกำหนดบริบทที่กำหนดชื่อได้ โดยพื้นฐานแล้วเนมสเปซกำหนดขอบเขต
การกำหนดเนมสเปซ
นิยามเนมสเปซเริ่มต้นด้วยคีย์เวิร์ด namespace ตามด้วยชื่อเนมสเปซดังนี้ -
namespace namespace_name {
// code declarations
}
ในการเรียกใช้เวอร์ชันที่เปิดใช้งานเนมสเปซของฟังก์ชันหรือตัวแปรให้นำหน้า (: :) ชื่อเนมสเปซดังนี้ -
name::code; // code could be variable or function.
ให้เราดูว่าเนมสเปซขอบเขตเอนทิตีรวมถึงตัวแปรและฟังก์ชันอย่างไร -
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main () {
// Calls function from first name space.
first_space::func();
// Calls function from second name space.
second_space::func();
return 0;
}
หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Inside first_space
Inside second_space
คำสั่งการใช้
คุณยังสามารถหลีกเลี่ยงการเติมเนมสเปซล่วงหน้าด้วยนามสกุล using namespaceคำสั่ง คำสั่งนี้บอกคอมไพลเลอร์ว่าโค้ดที่ตามมาใช้ชื่อในเนมสเปซที่ระบุ ดังนั้นเนมสเปซจึงมีนัยสำหรับรหัสต่อไปนี้ -
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// This calls function from first name space.
func();
return 0;
}
หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Inside first_space
คำสั่ง 'ใช้' ยังสามารถใช้เพื่ออ้างถึงรายการเฉพาะภายในเนมสเปซ ตัวอย่างเช่นถ้าส่วนเดียวของเนมสเปซมาตรฐานที่คุณต้องการใช้คือ cout คุณสามารถอ้างถึงได้ดังนี้ -
using std::cout;
รหัสต่อมาสามารถอ้างถึง cout โดยไม่ต้องเติมเนมสเปซล่วงหน้า แต่รายการอื่น ๆ ในไฟล์ std เนมสเปซยังคงต้องมีความชัดเจนดังต่อไปนี้ -
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
std::endl is used with std!
ชื่อที่แนะนำในไฟล์ usingคำสั่งปฏิบัติตามกฎขอบเขตปกติ ชื่อสามารถมองเห็นได้จากจุดของusingคำสั่งไปยังจุดสิ้นสุดของขอบเขตที่พบคำสั่ง เอนทิตีที่มีชื่อเดียวกันซึ่งกำหนดไว้ในขอบเขตภายนอกจะถูกซ่อนไว้
เนมสเปซที่ไม่ชัดเจน
สามารถกำหนดเนมสเปซได้หลายส่วนดังนั้นเนมสเปซจึงประกอบด้วยผลรวมของส่วนที่กำหนดแยกกัน ส่วนที่แยกจากกันของเนมสเปซสามารถกระจายไปยังไฟล์หลาย ๆ ไฟล์
ดังนั้นหากส่วนหนึ่งของเนมสเปซต้องการชื่อที่กำหนดในไฟล์อื่นก็ยังต้องประกาศชื่อนั้น การเขียนนิยามเนมสเปซต่อไปนี้เป็นการกำหนดเนมสเปซใหม่หรือเพิ่มองค์ประกอบใหม่ให้กับที่มีอยู่ -
namespace namespace_name {
// code declarations
}
เนมสเปซที่ซ้อนกัน
Namespaces สามารถซ้อนกันซึ่งคุณสามารถกำหนดหนึ่งเนมสเปซภายในช่องชื่ออื่นได้ดังนี้ -
namespace namespace_name1 {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
คุณสามารถเข้าถึงสมาชิกของเนมสเปซที่ซ้อนกันได้โดยใช้ตัวดำเนินการความละเอียดดังนี้ -
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
// to access members of namespace:name1
using namespace namespace_name1;
ในข้อความข้างต้นหากคุณใช้ namespace_name1 จะทำให้องค์ประกอบของ namespace_name2 มีอยู่ในขอบเขตดังนี้ -
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main () {
// This calls function from second name space.
func();
return 0;
}
หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Inside second_space