ฉันจะ“ ยกเลิกการใช้” เนมสเปซได้อย่างไร


86

ความหลากหลายของระบบการพัฒนาของฉัน (Codegear C ++ Builder) คือบางส่วนของส่วนหัวที่สร้างขึ้นโดยอัตโนมัติยืนยันว่ามี ...

using namespace xyzzy

... ข้อความในนั้นซึ่งส่งผลกระทบต่อรหัสของฉันเมื่อฉันต้องการหรือคาดหวังน้อยที่สุด

มีวิธีใดบ้างที่ฉันสามารถยกเลิก / แทนที่คำสั่ง "ใช้" ก่อนหน้านี้เพื่อหลีกเลี่ยงปัญหานี้

อาจจะ...

unusing namespace xyzzy;

3
คุณควรเปิดรายงานข้อบกพร่องด้วยระบบ QC ของพวกเขา: qc.codegear.com
Kris Kumler

2
BTW ส่วนหัวที่สร้างขึ้นโดยอัตโนมัติคืออะไร
Kris Kumler

2
วันหนึ่ง C ++ จะมีโมดูลและการรวมโค้ดลงในโค้ดอื่น ๆ จะมีโครงสร้างการห่อหุ้มที่ดีกว่า ก่อนหน้านี้ไม่มีวิธีง่ายๆในการแก้ไขปัญหานี้ ลองใส่รหัสของคุณเองลงในเนมสเปซและอ้างอิงด้วยวิธีนั้น
Trevor Hickey

คำตอบ:


59

ไม่ แต่มีวิธีแก้ไขที่เป็นไปได้: ถ้าคุณใส่คำสั่งรวมไว้ในเนมสเปซของตัวเองเช่นนี้ ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... จากนั้นผลของการใช้คำสั่งใด ๆ ภายในส่วนหัวนั้นจะถูกทำให้เป็นกลาง

ซึ่งอาจเป็นปัญหาในบางกรณี นั่นเป็นเหตุผลที่คู่มือสไตล์ C ++ ทุกฉบับไม่แนะนำให้ใส่คำสั่ง "ใช้เนมสเปซ" ในไฟล์ส่วนหัว


1
โดยทั่วไปนี่เป็นความคิดที่ผิดมหันต์ ส่วนหัว C ++ ไม่ได้ตั้งใจให้รวมอยู่ในเนมสเปซสำรองตามที่ใช้ที่นี่
Aaron

25
เป็นความคิดที่แย่มากที่จะรวมคำสั่งการใช้ไว้ในไฟล์ส่วนหัวด้วย วิธีนี้ช่วยบรรเทาปัญหานั้นได้
Head Geek

4
การวางส่วนหัวในเนมสเปซของคุณเองไม่ใช่วิธีแก้ปัญหาเนื่องจากจะเปลี่ยนความหมายของการประกาศในไลบรารีนั้น (-1)
Richard Corden

4
ขึ้นอยู่กับสิ่งที่ประกาศในส่วนหัว
Head Geek

1
ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นพฤติกรรมที่ไม่ได้กำหนด
Kris Kumler

56

ไม่คุณไม่สามารถยกเลิกการใช้เนมสเปซได้ สิ่งเดียวที่คุณทำได้คือวางusing namespace-statement บล็อกเพื่อ จำกัด ขอบเขต

ตัวอย่าง:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

บางทีคุณอาจเปลี่ยนเทมเพลตที่ใช้กับส่วนหัวที่สร้างขึ้นโดยอัตโนมัติได้


คุณสามารถรวมในบล็อกเช่นนี้ได้หรือไม่?
Eclipse

ใช่สิ่งนี้จะไม่เกิดขึ้นกับรหัสที่สร้างขึ้นอัตโนมัติ Byt mybe เขาสามารถเปลี่ยนเทมเพลตสำหรับรหัสที่สร้างขึ้นโดยอัตโนมัติได้หรือไม่?
jk.

ใช่นี่ไม่ได้ช่วยแก้ปัญหาที่เขามีส่วนหัวโดยใช้เนมสเปซ
Kip

น่าเสียดายที่นี่ไม่เป็นความจริง ลองสิ่งนี้:
อดัม

namespace xyzzy {const int i {การใช้ namespace xyzzy; } // หยุดใช้ namespace xyzzy ที่นี่
อดัม

17

คุณอาจติดขัดในการใช้เนมสเปซที่ชัดเจนเกี่ยวกับความขัดแย้ง:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

10

สำหรับการอ้างอิงในอนาคต: เนื่องจากเวอร์ชัน XE มีค่าใหม่ที่คุณสามารถ #define เพื่อหลีกเลี่ยงusing namespace System;int ที่น่ากลัวได้แก่ DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


แต่ดูเหมือนว่าจะทำงานไม่ถูกต้อง อย่างน้อยในทุกกรณีฉันได้ลอง (กับ BCB6) จากนั้นฉันเคยถอยกลับไปที่การเพิ่มเนมสเปซที่ชัดเจนเกี่ยวกับความขัดแย้งและ - ยิ่งแย่ไปกว่านั้น - รวมส่วนหัวเพื่อหลีกเลี่ยงความขัดแย้งของชื่อประเภท ...
Wolf

5

วิธีการใช้ sed, perl หรือเครื่องมือบรรทัดคำสั่งอื่น ๆ เป็นส่วนหนึ่งของกระบวนการสร้างของคุณเพื่อแก้ไขส่วนหัวที่สร้างขึ้นหลังจากที่สร้างขึ้น แต่ก่อนที่จะใช้?


1

การทดลองอย่างรวดเร็วด้วย Visual Studio 2005 แสดงให้เห็นว่าคุณสามารถใส่ส่วนหัวเหล่านั้นไว้ในเนมสเปซที่ตั้งชื่อของคุณเองจากนั้นuseสิ่งที่คุณต้องการจากเนมสเปซนี้ (แต่อย่าuseใช้เนมสเปซทั้งหมดเนื่องจากจะแนะนำเนมสเปซที่คุณต้องการซ่อน


1
สิ่งนี้อาจทำให้เกิดปัญหาในการแยกชื่อหากไฟล์ส่วนหัวเป็นการประกาศสำหรับไลบรารี การคอมไพล์จะสำเร็จ แต่ตัวเชื่อมโยงจะไม่สามารถค้นหาคำจำกัดความได้เนื่องจากคอมไพล์จะอยู่ในเนมสเปซอื่นแล้ว
Eclipse

-1
#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}

1
กรุณาอธิบายคำตอบของคุณ!
Mazz

คุณสามารถใช้ตัวดำเนินการความละเอียดขอบเขตเพื่อใช้ตัวแปรเนมสเปซอื่น
Narendra Kumawat

3
ไม่ตอบคำถาม
MM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.