2012-02-06 36 views
5

Tôi đã xác định một số chức năng (không có lớp học nào liên quan ở đây) trong tệp * .cpp bên ngoài và tất nhiên có tệp * .h thích hợp.Tôi có sử dụng không gian tên không tên trong tệp triển khai không?

Một số chức năng trong tệp * .cpp được sử dụng chỉ trong tệp * .cpp đó ở nơi khác. Chúng thậm chí không được đề cập trong tệp * .h.

Tôi có nên đặt các chức năng đó vào một không gian tên chưa đặt tên hoặc chúng có thể sống ngay bên cạnh các chức năng khác không? Và nếu vậy, tại sao tôi cần một không gian tên không tên cho họ? Tôi không thể nhìn thấy một vấn đề, kể từ khi những chức năng không thể truy cập từ bên ngoài anyway.

+0

Tại sao không chỉ khiến chúng 'tĩnh'? (như trong một hàm tĩnh C, không phải là một phương thức lớp tĩnh) –

+1

@JamesMcLaughlin: Cũng trong C++ 03 'static' đã không còn được dùng cho mục đích đó nữa. Tuy nhiên, C++ 11 không sử dụng nó. Nhưng 'tĩnh' và nằm trong không gian tên không tên có nghĩa là những thứ khác nhau. 'static' sẽ cung cấp cho nó liên kết nội bộ, do đó, chức năng không thể được sử dụng cho một số mục đích. –

+0

Cảm ơn các đề xuất của bạn. Có bất kỳ giải pháp nào, không gian tên tĩnh hoặc không được quét, được đề xuất hoặc được ưu tiên không? – user1192880

Trả lời

9

Nếu bạn muốn chúng thật sự riêng tư với đơn vị biên dịch đó, hãy đặt chúng vào một không gian tên ẩn danh. Nếu bạn không thì ai đó có thể tuyên bố những chức năng đó ở nơi khác và sử dụng chúng một cách rõ ràng.

Lấy ví dụ sau đây:

// library.cpp 

// a "private" function here, in that it is not declared anywhere 
void f() {} 

namespace 
{ 
    // same as above, except within an anonymous namespace 
    void g() {} 
} 

// client.cpp 

void f(); 

int main() 
{ 
    // Can call f(), it's been declared and is now effectively "public" 
    f(); 

    // compilation error, this has no idea what g() is, it's not declared 
    // in any scope that can be resolved here 
    g(); 

    return 0; 
} 
+0

Cảm ơn bạn! Tôi đã không nhận thức được rằng "tính năng". – user1192880

+0

Đây là những gì 'tĩnh' là cho. Các không gian tên ẩn danh cung cấp tính năng này cho các lớp và các cấu trúc. –

+0

Từ khóa 'static' có bảo vệ chống lại va chạm tên với các hàm khác có thể tồn tại trong các phần khác của mã không? Không gian tên không tên sẽ. – Chad

1

Tôi đoán nếu bạn không muốn các chức năng để được nhìn thấy từ bên ngoài tuyên bố chúng như static.

+0

* "... nhìn từ bên ngoài ..." * - Từ bên ngoài cái gì? Tiêu đề? Đơn vị dịch thuật? – jww

4

Câu hỏi của bạn có thể được chia làm hai:

1. "? Làm thế nào tôi có thể ẩn chức năng toàn cầu"

Một cách đơn giản để làm điều đó, là KHÔNG đặt tiêu đề của hàm vào file header:

//============================ 
// Filename: "mylibrary.hpp" 
//============================ 
// Description: 
// Utility functions. 
//============================ 
#ifndef MYLIBRARY_H_INCLUDED 
#define MYLIBRARY_H_INCLUDED 
//============================ 

namespace MyLibrary 
{ 
    void DoSomething(); 
} // namespace MyLibrary 

//============================ 
#endif // MYLIBRARY_H_INCLUDED 
//============================ 

tập tin mã đầy đủ:

//============================ 
// Filename: "mylibrary.cpp" 
//============================ 
// Description: 
// Utility functions. 
//============================ 
// self header include 
#include "mylibrary.hpp" 
//============================ 

namespace MyLibrary 
{ 
    void DoSomethingBefore() 
    { 
     // ... 
    } 

    void DoSomethingAfter() 
    { 
     // ... 
    } 

    void DoSomethingConfirmed() 
    { 
     // ... 
    } 

    void DoSomething() 
    { 
     DoSomethingBefore(); 
     DoSomethingConfirmed(); 
     DoSomethingAfter(); 
    } 
} // namespace MyLibrary 

//============================ 
#endif // MYLIBRARY_H_INCLUDED 
//============================ 

Khi điều này được biên soạn , bạn nhận được tệp "mylibrary.o" hoặc "mylibrary.obj". Bạn có thể cung cấp nó cho các nhà phát triển khác như: "mylibrary.hpp" cộng với "mylibrary.obj", nhưng không có tệp "mylibrary.cpp". Hầu hết các trình biên dịch "plain c"/"C++" đều có thể hoạt động theo cách này.

Có nhiều cách khác, hãy đọc phần tiếp theo.

2. "Các không gian tên ẩn danh, một kỹ thuật tốt để ẩn các chức năng toàn cầu?"

Kỹ thuật "Không gian tên vô danh", là một cách khác để ẩn các chức năng toàn cầu.

Có một câu hỏi tương tự như trên:

Unnamed/anonymous namespaces vs. static functions

Nhưng, cá nhân, tôi không khuyên bạn nên kỹ thuật này, là câu trả lời "yêu thích".

Không gian tên là một trong những thứ mà tôi muốn tồn tại kể từ khi bắt đầu "pure c" hoặc "C++". Tuy nhiên, "không gian tên ẩn danh" hoặc "không gian tên không xác định", có vẻ lạ khi sử dụng.

Giống như cố gắng che giấu thứ gì đó, và sau này, hãy quên, bạn lưu trữ ở đâu.

3 gợi ý bổ sung

(a) Tôi đề nghị sử dụng một đơn chính REQUIRED, không bắt buộc, không gian tên không nặc danh cho mỗi tập tin. Nó có thể có lồng nhau, các không gian tên bên trong bổ sung. Mỗi không gian tên chính, phải có cùng một id. làm tên tệp, nhưng không có đuôi tệp hoặc đuôi tệp.

(b) Tránh các không gian tên ẩn danh. Nó giống như lưu trữ mọi thứ trong một nhà kho, không có chỉ mục.

(c) Sử dụng phần mở rộng tệp hoặc tiền tố tệp, trong tệp tiêu đề của bạn, có thể là ".h" hoặc ".hpp", ngay cả khi tệp C++ của nó. Tiêu chuẩn nói C++ không nên sử dụng đuôi tệp hoặc đuôi tệp trên các tệp "C++", nhưng rất khó xác định hoặc tìm thấy trên hệ thống tệp.

Chúc may mắn.

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