2010-01-28 41 views
29

Với using namespace Tôi làm cho toàn bộ nội dung của không gian tên đó hiển thị trực tiếp mà không cần sử dụng bộ định danh vùng tên. Điều này có thể gây ra vấn đề nếu using namespace xảy ra trong các tiêu đề được sử dụng rộng rãi - chúng ta có thể vô tình tạo hai không gian tên với các tên lớp giống hệt nhau và trình biên dịch sẽ từ chối biên dịch trừ khi tên lớp được thêm vào với bộ định danh vùng tên.Tôi có thể hoàn tác tác dụng của "sử dụng không gian tên" trong C++ không?

Tôi có thể hoàn tác using namespace để trình biên dịch quên rằng nó đã xem trước đó không?

+0

Tôi đặt cược có một hack thực sự xấu xí bằng cách sử dụng bộ xử lý trước cho việc này. Nhưng tôi đoán bạn không muốn rằng –

+6

@Eli: Không có trong Tăng cường, điều này có thể có nghĩa là không có. –

+0

Một giải pháp khả thi để rút ngắn những gì bạn phải gõ là '#define N namespace ::' ở đầu tệp và '#undef N' ở dưới cùng. Tất nhiên điều này có nghĩa là bạn phải cẩn thận để không bao giờ sử dụng 'N' ở bất cứ đâu trong tệp mà bạn không muốn' namespace :: '. Một 'typedef' có khả năng cũng hữu ích. – Yay295

Trả lời

35

Không, nhưng bạn có thể nói với đồng nghiệp rằng bạn không bao giờ nên có chỉ thị using hoặc tuyên bố trong tiêu đề.

3

Không phải là kiến ​​thức của tôi ... Nhưng theo quy tắc, tôi chỉ sử dụng "sử dụng không gian tên" trong tệp .cpp.

15

Như những người khác đã nói, bạn không thể và vấn đề không nên ở đó ngay từ đầu.
Tiếp theo-best điều bạn có thể làm là mang lại những biểu tượng cần thiết của bạn để họ được ưa thích bởi các tên nhìn lên:

namespace A { class C {}; } 
namespace B { class C {}; } 
using namespace A; 
using namespace B; 

namespace D { 
    using A::C; // fixes ambiguity 
    C c; 
} 

Trong một số trường hợp, bạn cũng có thể quấn vi phạm bao gồm với một không gian tên:

namespace offender { 
# include "offender.h" 
} 
+7

Kỹ thuật cuối cùng đó có thể là một loại sâu. Nếu phạm tội. Bao gồm các tiêu đề được bảo vệ '# define', bây giờ những biểu tượng đó bị mắc kẹt trong phạm nhân. Bạn có thể cố gắng đặt toàn bộ gói giao diện của nó một cách toàn diện vào một không gian tên mới, nhưng vẫn hy vọng nó không bao gồm các tiêu đề hệ thống. Và nếu nó hoạt động một lần, nó có thể phá vỡ trong phiên bản tiếp theo. – Potatoswatter

+2

Do đó * trong một số trường hợp *. –

6

Không, tiêu chuẩn C++ không nói gì về "hoàn tác". Điều tốt nhất bạn được phép làm là để hạn chế phạm vi using:

#include <vector> 

namespace Ximpl { 

using namespace std;  
vector<int> x; 

} 

vector<int> z; // error. should be std::vector<int> 

Nhưng tiếc using namespace Ximpl sẽ mang lại tất cả các tên từ std namespace là tốt.

0

Gần nhất, rằng tôi sẽ cố gắng sử dụng trong các tập tin tiêu đề là sau đây:

//example.h 

#ifndef EXAMPLE_H_ 
#define EXAMPLE_H_ 


/** 
* hating c++ for not having "undo" of using namespace xx 
*/ 
#define string std::string 
#define map std::map 

class Example { 
public: 
    Example (const char *filename); 
    Example (string filename); 
    ~Example(); 
private: 
    map<string,complicated_stuff*> my_complicated_map; 

}; 

#undef string 
#undef map 

#endif //EXAMPLE_H_ 

sau khi tất cả, định nghĩa là #undef -able. Có 2 vấn đề: 1. nó là xấu xí 2. riêng biệt #define và #undef cho mỗi tên từ không gian tên tương ứng được sử dụng

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