พิจารณาสองคำสั่งสเกลาร์ต่อไปนี้ในขอบเขตสากล ในโปรแกรมต่อไปนี้:
#รวม
ใช้เนมสเปซ std;
intvarId= 5;
ลอยvarId= 2.3;
intหลัก()
{
กลับ 0;
}
ความพยายามที่จะคอมไพล์โปรแกรมนี้ทำให้เกิดข้อผิดพลาดในการคอมไพล์ มีตัวแปรสองตัวที่มีชื่อเดียวกันคือ varId . แม้ว่าจะเป็นตัวแปรสองแบบที่แตกต่างกันของสองประเภทที่แตกต่างกัน int และ ลอย คอมไพเลอร์ปฏิเสธการประกาศทั้งสองเนื่องจากเป็นชื่อเดียวกัน โปรแกรมต่อไปนี้แก้ปัญหานี้โดยการประกาศตัวแปรที่มีชื่อเดียวกันในขอบเขตทั่วไปที่แตกต่างกันสองขอบเขต:
#รวม
ใช้เนมสเปซ std;
เนมสเปซ NA
{
intvarId= 5;
}
เนมสเปซ NB
{
ลอยvarId= 2.3;
}
intหลัก()
{
ค่าใช้จ่าย<<NA::varId << 'NS';
ค่าใช้จ่าย<<NB::varId << 'NS';
กลับ 0;
}
ผลลัพธ์จะเป็นดังนี้:
5
2.3
มีสองเนมสเปซในโปรแกรมด้านบน: NA ซึ่งมีคำจำกัดความของจำนวนเต็มและ NB ซึ่งมีคำจำกัดความของ float แต่มีชื่อเดียวกับจำนวนเต็มสำหรับ NA สุดท้าย เมื่อรันโปรแกรม จะใช้ชื่อเดียวกันสำหรับตัวแปร 2 ตัวที่ต่างกัน โปรดทราบว่าในการเข้าถึงชื่อเดียวกันของสองตัวแปรที่แตกต่างกัน ต้องใช้ชื่อเฉพาะสำหรับเนมสเปซ ตามด้วยตัวระบุร่วม ชื่อเนมสเปซและตัวระบุทั่วไปจะถูกคั่นด้วยตัวดำเนินการแก้ไขขอบเขต :: . ชื่อของเนมสเปซจะทำให้วัตถุแตกต่าง
บทความนี้ครอบคลุมแนวคิดพื้นฐานของเนมสเปซและการใช้งานในภาษาการเขียนโปรแกรม C++ เพื่อติดตามบทความนี้ คุณควรมีความรู้พื้นฐานเกี่ยวกับภาษา C++ คุณควรมีความรู้เกี่ยวกับขอบเขต C++ ด้วยเช่นกัน แม้ว่าจะมีคำอธิบายสั้น ๆ ในบทความนี้ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับขอบเขต C++ ให้ค้นหาวลี ขอบเขตใน C++ (โดยไม่ใส่เครื่องหมายอัญประกาศ) ในช่องค้นหาของหน้าเว็บ linuxhint.com ใดๆ แล้วกด Enter สิ่งนี้จะนำคุณไปสู่บทความที่ผู้เขียนคนนี้เขียน
เนื้อหาบทความ
เนมสเปซคืออะไร?
ภูมิภาคประกาศเป็นส่วนที่ใหญ่ที่สุดของโปรแกรมที่ชื่อของเอนทิตี (ตัวแปร) ถูกต้อง ภูมิภาคนี้เรียกว่าขอบเขต เนมสเปซใน C ++ เป็นขอบเขตทั่วไปที่มีจุดประสงค์หลักเพื่อแก้ไขข้อขัดแย้งของชื่อ เนมสเปซมีการประกาศพื้นฐานและ/หรือคำจำกัดความของเอนทิตี
เนมสเปซสากลและปัญหาของมัน
เนมสเปซส่วนกลางคือขอบเขตส่วนกลาง พิจารณาโปรแกรมสั้น ๆ ต่อไปนี้:
#รวมใช้เนมสเปซ std;
intตัวตน= 55;
ลอยตัวตน= 12.17;
intหลัก()
{
กลับ 0;
}
ในโปรแกรมข้างต้นจะมีตัวแปรอยู่ 2 ตัว เรียกว่า ตัวตน . ตัวแปรเหล่านี้อยู่ในขอบเขตสากล นั่นคืออยู่ในเนมสเปซส่วนกลาง ความพยายามที่จะรวบรวมโปรแกรมนี้จะล้มเหลวโดยมีข้อความแสดงข้อผิดพลาด ขอบเขตส่วนกลางไม่ยอมรับตัวแปรมากกว่าหนึ่งตัวที่มีชื่อเดียวกัน ดังนั้นจึงจำเป็นต้องมีเนมสเปซที่กำหนดเอง
เนมสเปซที่กำหนดเอง
เนมสเปซไม่ได้มีเพียงชื่อเดียว แต่เนมสเปซจะมีชุดชื่อเพื่อหลีกเลี่ยงความขัดแย้งกับชื่อชุดอื่นๆ เพื่อหลีกเลี่ยงความขัดแย้งในโค้ด ให้นำหน้าชื่อแต่ละชื่อด้วยชื่อของเนมสเปซและ :: . โปรแกรมต่อไปนี้แสดงสิ่งนี้โดยใช้เนมสเปซที่กำหนดเองสองรายการ:
#รวมใช้เนมสเปซ std;
เนมสเปซ NA
{
intvarInt= 6;
ลอยflt;
}
เนมสเปซ NB
{
intvarInt= 7;
ลอยflt;
}
intหลัก()
{
ค่าใช้จ่าย<<NA::varInt << 'NS';
ค่าใช้จ่าย<<NB::varInt << 'NS';
NA::flt = 2.5;
NB::flt = 4.8;
ค่าใช้จ่าย<<NA::flt << 'NS';
ค่าใช้จ่าย<<NB::flt << 'NS';
กลับ 0;
}
ผลลัพธ์คือ:
67
2.5
4.8
โปรดทราบว่าชื่อ NA::flt และ หมายเหตุ::flt ได้รับการกำหนดในที่สุดใน หลัก() การทำงาน. C ++ ไม่อนุญาตให้มีคำจำกัดความดังกล่าวในขอบเขตส่วนกลาง
โปรดทราบว่าเนมสเปซที่กำหนดเองเป็นเนมสเปซที่ซ้อนกันสำหรับเนมสเปซส่วนกลาง
การใช้คำสั่ง
เพื่อหลีกเลี่ยงการพิมพ์ namepace::name ตลอดเวลาแทนที่จะแค่ name หลังจากประกาศเนมสเปซ คุณอาจใช้ โดยใช้ คำสั่ง ไวยากรณ์ที่จะใช้ โดยใช้ คำสั่งดังต่อไปนี้:
โดยใช้เนมสเปซ Namespace_name;NS โดยใช้ คำสั่งไม่ใช่คำสั่งตัวประมวลผลล่วงหน้า ดังนั้นจึงลงท้ายด้วยเครื่องหมายอัฒภาค (;)
โปรแกรมต่อไปนี้แสดงให้เห็นถึงการใช้ โดยใช้ คำสั่งและอื่น ๆ :
#รวมใช้เนมสเปซ std;
เนมสเปซ NB
{
intvarInt= 7;
intการทำงาน()
{
กลับvarInt;
}
}
intfn()
{
ใช้เนมสเปซNB;
intmyVar2=การทำงาน();
//อ็อบเจกต์และฟังก์ชันอื่นๆ จาก NB ตามมา
กลับmyVar2;
}
intmyVar3=NB::การทำงาน();
intหลัก()
{
ค่าใช้จ่าย<<fn() << '' <<myVar3<< 'NS';
กลับ 0;
}
ผลลัพธ์ของโปรแกรมนี้คือ 7 7 . คำว่า ใช้เนมสเปซ NB; ถูกวางไว้ที่จุดเริ่มต้นของ fn() คำนิยาม. NS ฟังก์ () จากเนมสเปซ NB จะถูกเรียกด้านล่างนั้นโดยไม่ต้องนำหน้าด้วย หมายเหตุ:: .
ตัวแปรที่ประกาศในขอบเขตสากล (เนมสเปซส่วนกลาง) จะเห็นได้จากจุดประกาศจนถึงจุดสิ้นสุดของไฟล์ นอกจากนี้ยังเห็นได้ในเนมสเปซที่ซ้อนกัน (ขอบเขตที่ซ้อนกัน) เช่น nested fn() ขอบเขตการทำงานด้านบน NS โดยใช้ directive รวมเนมสเปซจากตำแหน่งที่วางไปยังจุดสิ้นสุดของขอบเขตที่วาง
ชื่อ ฟังก์ () จากเนมสเปซ NB ไม่สามารถมองเห็นได้ด้านล่าง fn() ความหมายเพราะ ใช้เนมสเปซ NB; ถูกวางไว้ภายในขอบเขตฟังก์ชัน (บล็อก) ภายใต้เงื่อนไขนี้ ให้ใช้ ฟังก์ () นอกบล็อกเนมสเปซ NB (ขอบเขต) จะต้องนำหน้าด้วย หมายเหตุ:: ดังข้อความต่อไปนี้
intmyVar3=NB::การทำงาน();NS โดยใช้ directive รวมเนมสเปซของมันกับเนมสเปซที่ซ้อนกันภายนอกจากตำแหน่งที่มันถูกวางไว้ที่จุดสิ้นสุดของเนมสเปซการซ้อนด้านนอก ในโปรแกรมต่อไปนี้ เนมสเปซ NA จะเข้าร่วมกับเนมสเปซส่วนกลาง เนมสเปซทั้งสองจะขยายไปยัง fn() เนมสเปซนิยามฟังก์ชัน ซึ่งรวมเข้ากับเนมสเปซ NB เนมสเปซ NB สิ้นสุดที่ส่วนท้ายของ fn() นิยามฟังก์ชัน และเนมสเปซก่อนหน้าสองรายการจะดำเนินต่อไปจนถึงจุดสิ้นสุดของไฟล์ (อ่านโค้ด)
#รวมใช้เนมสเปซ std;
เนมสเปซ NA
{
intvarInt= 6;
intการทำงาน()
{
กลับvarInt;
}
}
เนมสเปซ NB
{
intvarInt= 7;
intการทำงาน()
{
กลับvarInt;
}
}
ใช้เนมสเปซ NA;
intmyVar0=varInt;
//อ็อบเจกต์และฟังก์ชันอื่นๆ จาก :: และ NB ตามมา
intfn()
{
intmyVar1=varInt;
ใช้เนมสเปซNB;
intmyVar2=NB::การทำงาน();
//อ็อบเจกต์และฟังก์ชันอื่นๆ จาก NB จะติดตามไปจนจบขอบเขตนี้
กลับmyVar1+myVar2;
}
// เฉพาะอ็อบเจ็กต์และฟังก์ชันจาก :: และ NB เท่านั้นที่ตามมา
intmyVar3=NB::การทำงาน();
intหลัก()
{
ค่าใช้จ่าย<<myVar0<< '' <<fn() << '' <<myVar3<< 'NS';
กลับ 0;
}
ผลลัพธ์คือ 6, 13, 7 ขวบ .
บันทึก: เนมสเปซส่วนกลางถูกระบุด้วย :: หมายความว่าไม่มีอะไรก่อนตัวดำเนินการแก้ไขขอบเขตที่ตามมา
ด้านล่างข้อความ ใช้เนมสเปซ NA; ตัวแปรจากเนมสเปซส่วนกลางและ NA สามารถใช้ได้โดยไม่ต้องระบุเนมสเปซต้นทาง คำสั่งถัดไปใช้ varInt ของเนมสเปซ NA ภูมิภาคเนมสเปซที่รวมกันทั่วโลกและ NA ขยายไปสู่ fn() ฟังก์ชันเนมสเปซ ดังนั้น varInt ของคำสั่งแรกใน fn() ขอบเขตฟังก์ชันเป็นของเนมสเปซ NA
เนื่องจากภูมิภาคสำหรับเนมสเปซสากลและ NA ขยายไปทั่ว fn() ขอบเขตหลังจาก int myVar2 = NB::func(); , ชื่อใดๆ จากเนมสเปซ NB สามารถใช้ได้เฉพาะใน fn() ขอบเขตโดยไม่ต้องนำหน้าด้วย หมายเหตุ:: เฉพาะในกรณีที่ไม่เกิดขึ้นใน NA และเนมสเปซส่วนกลาง (บล็อก) มิฉะนั้น ให้นำหน้า หมายเหตุ:: . ภูมิภาคของเนมสเปซที่รวมกันสำหรับ NA และทั่วโลกอยู่ด้านล่าง fn() ความหมายและเข้าสู่ หลัก() ทำงานจนสิ้นสุดไฟล์
ส่วนขยายของเนมสเปซ NB เริ่มต้นจาก int myVar2 = NB::func(); ใน fn() บล็อกและสิ้นสุดที่ส่วนท้ายของ fn() บล็อกคำจำกัดความ
บันทึก: เนมสเปซที่รวมขอบเขตไม่ควรมีชื่อตัวแปรเดียวกันในบล็อกเนมสเปซที่ต่างกัน เนื่องจากจะยังทำให้เกิดข้อขัดแย้ง
ภูมิภาคเนมสเปซ
เนมสเปซเป็นขอบเขต นอกเหนือจากเนมสเปซส่วนกลาง (ขอบเขตสากล) ควรประกาศเนมสเปซใด ๆ ในบล็อก บล็อกนั้นเป็นส่วนแรกของพื้นที่ที่อาจกระจายของเนมสเปซ ด้วยการใช้คำสั่ง เนมสเปซสามารถขยายเป็นขอบเขตในขอบเขตอื่นๆ
เอนทิตีที่ประกาศในเนมสเปซเนื้อหาถูกกล่าวถึงว่าเป็นสมาชิกของเนมสเปซ และชื่อที่ประกาศโดยการประกาศเหล่านี้ลงในพื้นที่ประกาศของเนมสเปซจะกล่าวกันว่าเป็นชื่อสมาชิกของเนมสเปซ
เนมสเปซที่ซ้อนกัน
โปรแกรมต่อไปนี้แสดงเนมสเปซที่ซ้อนกัน:
#รวมใช้เนมสเปซ std;
เนมสเปซ A
{
intผม= 1;
เนมสเปซ B
{
intผม= 2;
เนมสเปซ C
{
intผม= 3;
}
}
}
intหลัก()
{
ค่าใช้จ่าย<<ถึง::ผม << '' <<ถึง::NS::ผม << '' <<ถึง::NS::ค::ผม << 'NS';
กลับ 0;
}
ผลลัพธ์คือ:
1 2 3ขอให้สังเกตว่ามีการเข้าถึงค่าสามค่าโดยใช้ตัวดำเนินการแก้ไขขอบเขต
เนมสเปซมาตรฐาน
C ++ มีไลบรารี่ที่เรียกว่าไลบรารีมาตรฐาน ชื่อของอ็อบเจ็กต์ ฟังก์ชัน และเอนทิตีอื่นๆ ในไลบรารีนี้มาจากเนมสเปซที่เรียกว่าเนมสเปซมาตรฐาน เขียนเป็น ชั่วโมง . ไลบรารีมาตรฐานประกอบด้วยไลบรารีย่อย และหนึ่งในไลบรารีย่อยเหล่านี้คือ ไอโอสตรีม . NS ไอโอสตรีม ห้องสมุดมีวัตถุ ค่าใช้จ่าย ซึ่งใช้ในการส่งผลลัพธ์ไปยังคอนโซล (เทอร์มินัล)
ชื่อ ค่าใช้จ่าย ต้องอยู่ใน ชั่วโมง เนมสเปซ ใช้ ไอโอสตรีม กับมัน ชั่วโมง เนมสเปซ โปรแกรมควรเป็นดังนี้:
#รวมใช้เนมสเปซ std;
สังเกตการใช้ โดยใช้ คำสั่งและ ชั่วโมง . คำว่า #รวม เป็นคำสั่งตัวประมวลผลล่วงหน้าและไม่ได้ลงท้ายด้วยเครื่องหมายอัฒภาค ประกอบด้วยไฟล์ iostream ที่ตำแหน่งของคำสั่ง
บทสรุป
เนมสเปซเป็นขอบเขต คำอธิบายเนมสเปซ (คำจำกัดความ) ประกอบด้วยการประกาศพื้นฐานและ/หรือคำจำกัดความของออบเจ็กต์ C++ ฟังก์ชัน และเอนทิตีอื่นๆ นอกคำจำกัดความเนมสเปซ ชื่อสามารถเข้าถึงได้ด้วยไวยากรณ์ เนมสเปซชื่อ::ชื่อ . นอกเหนือจากเนมสเปซส่วนกลาง (ขอบเขตสากล) ควรประกาศเนมสเปซใด ๆ ในบล็อก บล็อกนั้นเป็นส่วนแรกของพื้นที่ที่อาจกระจายของเนมสเปซ กับ โดยใช้ คำสั่ง สามารถขยายเนมสเปซเป็นภูมิภาคในขอบเขตอื่นได้ เนมสเปซที่รวมขอบเขตไม่ควรมีชื่อตัวแปรเดียวกันในบล็อกเนมสเปซที่ต่างกัน เนื่องจากจะยังทำให้เกิดความขัดแย้งของชื่อ
คริส