2010-01-19 30 views
26

Khi sử dụng không gian tên ẩn danh có bất kỳ vấn đề nào nếu nó được lồng trong một không gian tên khác không? Ví dụ: có bất kỳ sự khác biệt thực sự nào giữa Foo1.cpp và Foo2.cpp trong mã sau:Không gian tên ẩn danh lồng nhau?

// Foo.h 
namespace Foo 
{ 
    void fooFunc(); 
} 

// Foo1.cpp 
namespace Foo 
{ 
    namespace 
    { 
     void privateFunction() 
     { 
      ... 
     } 
    } 

    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 

// Foo2.cpp 
namespace 
{ 
    void privateFunction() 
    { 
     ... 
    } 
} 

namespace Foo 
{ 
    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 
+0

Ký hiệu đã xuất sẽ khác nhau. Hãy xem một đầu ra nm. –

+2

Chỉ để trở thành pedantic, thuật ngữ kỹ thuật là 'không gian tên không xác định', không ẩn danh. – GManNickG

+0

Các công đoàn là ẩn danh, không gian tên không được đặt tên. Nhưng những người quan tâm :) –

Trả lời

26

Không gian tên ẩn danh có thể được coi là không gian tên bình thường với tên duy nhất mà bạn không biết. Theo tiêu chuẩn C++ 7.3.1.1:

Một giấu tên-namespace nét cư xử như thể nó đã được thay thế bởi

namespace unique { /* empty body */ } 
    using namespace unique; 
    namespace unique { namespace-body } 

nơi tất cả các lần xuất hiện của duy nhất trong một đơn vị dịch thuật được thay thế bởi các định danh tương tự và số nhận dạng này khác với tất cả các số nhận dạng khác trong toàn bộ chương trình.

Không có vấn đề gì khác.

3

Có lẽ không có sự khác biệt thực sự nào cho mục đích của bạn. Nó làm cho một sự khác biệt đến nơi trong tập tin cpp của bạn privateFunction có thể nhìn thấy. Nếu bạn thêm void barFunc() { privateFunction(); } vào cuối cả hai tệp thì Foo2.cpp biên dịch và Foo1.cpp thì không.

Thông thường bạn sẽ không xác định các biểu tượng bên ngoài từ nhiều không gian tên khác nhau trong cùng một tệp cpp, do đó sự khác biệt sẽ không xuất hiện.

Các vấn đề liên quan