คำตอบ:
โดยทั่วไปคุณกำลังอ้างถึงส่วน§7.3.1.1 / 2 จากมาตรฐาน C ++ 03
การใช้คีย์เวิร์ดแบบคงที่จะเลิกใช้เมื่อประกาศอ็อบเจ็กต์ในขอบเขตเนมสเปซ เนมสเปซที่ไม่มีชื่อเป็นทางเลือกที่เหนือกว่า
โปรดทราบว่าย่อหน้านี้ถูกลบออกไปแล้วใน C ++ 11 static
ฟังก์ชันเป็นไปตามมาตรฐานไม่เลิกใช้อีกต่อไป!
อย่างไรก็ตาม namespaces ไม่มีชื่อจะดีกว่าคำหลักที่คงที่ส่วนใหญ่เป็นเพราะคำที่static
ใช้เฉพาะกับตัวแปรการประกาศและฟังก์ชั่นไม่ให้ผู้ใช้กำหนดประเภท
รหัสต่อไปนี้ใช้ได้ใน C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
แต่รหัสนี้ไม่ถูกต้อง:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
วิธีแก้ปัญหาคือเนมสเปซที่ไม่มีชื่อซึ่งก็คือนี่
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
หวังว่ามันจะอธิบายว่าทำไมถึงunnamed-namespace
เหนือกว่าstatic
.
นอกจากนี้โปรดทราบว่าการใช้คีย์เวิร์ดแบบคงที่จะเลิกใช้เมื่อประกาศอ็อบเจ็กต์ในขอบเขตเนมสเปซ (ตามมาตรฐาน)
deprecated
คำพูดนี้จะถูกลบออกจาก C ++ 0x FCD ล่าสุด (n3225)
.cpp
กำลังกำหนดคลาสที่มีชื่อเดียวกัน
มีปัญหาที่น่าสนใจเกี่ยวกับสิ่งนี้:
สมมติว่าคุณใช้static
คำสำคัญหรือไม่มีชื่อnamespace
เพื่อทำให้ฟังก์ชันบางอย่างอยู่ภายในโมดูล (หน่วยการแปล) เนื่องจากฟังก์ชันนี้มีขึ้นเพื่อใช้ภายในโมดูลและไม่สามารถเข้าถึงได้จากภายนอก (ไม่มีชื่อnamespace
s มีข้อได้เปรียบในการสร้างข้อมูลและคำจำกัดความประเภทภายในเช่นกันนอกเหนือจากฟังก์ชัน)
เมื่อเวลาผ่านไปไฟล์ต้นฉบับของการใช้งานโมดูลของคุณจะมีขนาดใหญ่ขึ้นและคุณต้องการแยกไฟล์ออกเป็นไฟล์ต้นฉบับแยกกันหลายไฟล์ซึ่งจะช่วยให้สามารถจัดระเบียบโค้ดได้ดีขึ้นค้นหาคำจำกัดความได้เร็วขึ้นและสามารถรวบรวมได้อย่างอิสระ
แต่ตอนนี้คุณประสบปัญหา: ฟังก์ชันเหล่านั้นไม่สามารถอยู่static
ในโมดูลได้อีกต่อไปเนื่องจากstatic
ไม่ได้อ้างถึงโมดูลแต่เป็นไฟล์ต้นฉบับ (หน่วยการแปล) คุณถูกบังคับให้ทำให้ไม่static
อนุญาตให้เข้าถึงจากส่วนอื่น ๆ (ไฟล์ออบเจ็กต์) ของโมดูลนั้น แต่นี่ยังหมายความว่าพวกเขาไม่ได้ซ่อน / เป็นส่วนตัวกับโมดูลอีกต่อไป: มีการเชื่อมโยงภายนอกสามารถเข้าถึงได้จากโมดูลอื่น ๆ ซึ่งไม่ใช่ความตั้งใจเดิมของคุณ
การไม่ตั้งชื่อnamespace
จะไม่สามารถแก้ปัญหานี้ได้เนื่องจากมีการกำหนดไว้สำหรับไฟล์ต้นฉบับเฉพาะ (หน่วยการแปล) และไม่สามารถเข้าถึงได้จากภายนอก
จะดีมากถ้าใครสามารถระบุได้ว่าบางอย่างnamespace
คือprivate
อะไรก็ตามที่กำหนดไว้ในนั้นหมายถึงการใช้งานภายในโดยโมดูลที่เป็นของ แต่แน่นอนว่า C ++ ไม่มีแนวคิดเช่น "โมดูล" มีเพียง "หน่วยการแปล" ซึ่งผูกพันกับไฟล์ต้นฉบับอย่างแน่นหนา
static
งานได้เท่านั้น