C++ เนมสเปซ

C Namespace



เนมสเปซใน C ++ เป็นขอบเขตทั่วไป การประกาศเริ่มต้นด้วยคำสงวน เนมสเปซ ตามด้วยชื่อตัวเลือกของโปรแกรมเมอร์ และบล็อกในวงเล็บปีกกา บล็อกประกอบด้วยการประกาศพื้นฐานและ/หรือคำจำกัดความของออบเจ็กต์ C++ ฟังก์ชัน และเอนทิตีอื่นๆ

พิจารณาสองคำสั่งสเกลาร์ต่อไปนี้ในขอบเขตสากล ในโปรแกรมต่อไปนี้:







#รวม
ใช้เนมสเปซ 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;
}

ผลลัพธ์คือ:

6
7
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++ ฟังก์ชัน และเอนทิตีอื่นๆ นอกคำจำกัดความเนมสเปซ ชื่อสามารถเข้าถึงได้ด้วยไวยากรณ์ เนมสเปซชื่อ::ชื่อ . นอกเหนือจากเนมสเปซส่วนกลาง (ขอบเขตสากล) ควรประกาศเนมสเปซใด ๆ ในบล็อก บล็อกนั้นเป็นส่วนแรกของพื้นที่ที่อาจกระจายของเนมสเปซ กับ โดยใช้ คำสั่ง สามารถขยายเนมสเปซเป็นภูมิภาคในขอบเขตอื่นได้ เนมสเปซที่รวมขอบเขตไม่ควรมีชื่อตัวแปรเดียวกันในบล็อกเนมสเปซที่ต่างกัน เนื่องจากจะยังทำให้เกิดความขัดแย้งของชื่อ

คริส