เนมสเปซใน 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