globals แบบคงที่และเนมสเปซที่ไม่ระบุชื่อใน C ++


11
  1. เหตุใด C ++ จึงสร้างความแตกต่างระหว่างสถิตแบบคงที่ (การเชื่อมโยงภายใน) และสัญลักษณ์ในเนมสเปซที่ไม่มีชื่อ (การเชื่อมโยงภายนอก แต่ไม่มีวิธีการอ้างถึงจากภายนอกอย่างไรก็ตาม)

  2. เหตุผลเหล่านี้ยังคงใช้ได้หรือมีเหตุผลใหม่หรือไม่?

  3. มีสถานที่ใดบ้างที่ยังคงแตกต่างกันไป แต่ต้องมีกฎเกณฑ์ที่สหภาพนิรนามทั่วโลก (หรือขอบเขตของเนมสเปซ)staticที่ไม่ระบุชื่อและต้องเป็นอะไร

  4. สำหรับคะแนนโบนัสหากไม่มีเหตุผลดีๆที่ทำให้พวกเขาแตกต่างกันมีการขอให้เทียบเท่าหรือไม่?


เมื่อ C ++ แนะนำเนมสเปซ (C ++ 98) และเนมสเปซที่ไม่มีชื่อโดยเฉพาะรูปทรงแบบคงที่ถูกเลิกใช้แล้วล้าสมัยและด้อยกว่าสิ่งใหม่ในความกระตือรือร้นแม้ว่ามันจะถูกเปลี่ยนกลับด้วย C ++ 11 : การ
คัดค้านคำสำคัญ ... ไม่มาก

ก่อน C ++ 11 สัญลักษณ์ที่มีการเชื่อมโยงภายในไม่สามารถใช้เป็นอาร์กิวเมนต์ของเทมเพลต: ทำไม C ++ 03 จึงต้องการให้พารามิเตอร์เทมเพลตมีการเชื่อมโยงภายนอก


ดูเหมือนว่าคุณจะตอบคำถามของคุณเองเป็นส่วนใหญ่ยกเว้นบิต "การปฏิบัติตาม" บางทีคุณควรพิจารณาลบครึ่งหลังและโพสต์เป็นคำตอบแทนหรือไม่ หรือยังมีบางสิ่งที่ยังไม่ได้ตอบที่นี่
Kyle Strand

@ KyleStrand ปรับโครงสร้างใหม่ทั้งหมด
Deduplicator

คำตอบ:


3

ฉันไม่คิดว่านี่จะตอบคำถามของคุณทั้งหมด (หรือคำถามใด ๆ ) แต่ความแตกต่างที่สำคัญระหว่างการประกาศแบบคงที่ระดับไฟล์และเนมสเปซที่ไม่ระบุชื่อคือเนมสเปซใช้กับประเภทต่างๆด้วยstaticเช่นกัน เช่นเดียวกับที่คุณประกาศตัวแปร) นั่นคือสาเหตุที่ต้องการเนมสเปซดังนั้นจึงมีสำนวนเดียวในการประกาศข้อมูลและประเภทของไฟล์

เป็นตัวอย่างรหัสต่อไปนี้ควรรวบรวมได้ดี (ไม่มีประโยชน์จริง ๆ เนื่องจากคุณไม่สามารถแยกความแตกต่างระหว่างทั้งสองประเภท แต่ได้รับอนุญาต)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

การทดสอบการถ่ายทอดสดที่นี่


มันรวบรวมเพราะคุณไม่ได้ใช้ Foobar ในฟังก์ชั่นหลัก
dshil

ที่สำคัญสิ่งที่เกิดขึ้นถ้า CPP แฟ้มอื่นบอกรุ่นของตนเองstruct Foobar? class Foobarเลวยังคิดว่ามันตอนนี้ คิดเกี่ยวกับวิธีที่คุณวางแผนที่จะสร้างคอนสตรัคเตอร์สำหรับทั้งคู่
dgnuff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.