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.
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) –
@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. –
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