2015-06-25 15 views
5

Vì vậy, tôi đang xây dựng thư viện C++ 11 dựa trên các thư viện khác như opengl, SDL2, assimp, glm, v.v. Chỉ có vấn đề là hầu hết các thư viện đó đều có chức năng của chúng, hoặc các đối tượng trong không gian tên chung: điều này có thể xung đột với các lớp của tôi! (ví dụ vectơ assimp và lớp Vector của tôi ...) Vì vậy, tôi đã nghĩ đến việc đặt các thư viện trong một không gian tên thay vì để chúng ở đó để "gây ô nhiễm" không gian tên chung.Đặt C++ libs ra khỏi không gian tên chung

Tôi nghĩ để làm điều này:

namespace some_name_space 
{ 
    #include <some/kind/of/lib> 
} 

Nhưng tôi nhận ra rằng vẫn sẽ là một phần của thư viện trong không gian tên toàn cầu!

Bất kỳ đề xuất nào về cách đạt được điều này?

PS: Tôi có thể "bọc" libs, nhưng điều đó thực sự không thể quản lý được!

+1

Tôi có hiểu rằng bạn muốn chuyển ** mã của bên thứ ba ** vào không gian tên và để lại ** mã ** của riêng bạn trong không gian tên chung không? – Siguza

+0

Vâng, đúng vậy :) – MattMatt

+0

Tôi có thể hỏi tại sao bạn không chỉ chuyển mã của riêng bạn vào một không gian tên thay thế? Đặc biệt là kể từ khi bạn đang xây dựng một thư viện? Bạn sẽ gây cho người khác cùng một rắc rối mà bạn đang cố gắng giải quyết cho chính mình ở đây. – Siguza

Trả lời

2

Tôi đoán những gì bạn muốn là đặt tất cả các hàm và lớp của thư viện vào không gian tên.

Trong câu trả lời này, tôi sẽ sử dụng gl/gl.h để biết ví dụ.

Theo như tôi biết, dòng #include <gl/gl.h> sẽ được thay thế bằng tất cả mã từ gl/gl.h.

nếu bạn muốn di chuyển tất cả các lớp học và chức năng từ gl/gl.h vào một không gian tên (gl ví dụ), tôi nên tạo một file trung gian gọi là __gl.hpp với nội dung như:

namespace gl { 
    using namespace gl; //because gl/gl.h don't know namespace gl 
    #include <gl/gl.h> 
    //#include more and more kind of libraries which use namespace gl 
} 

Sau đó, trong tập tin chính của bạn , sử dụng #include "__gl.hpp" thay vì #include <gl/gl.h>

Lưu ý rằng macro có thể không được di chuyển vào namespace gl, vì chúng là macro.

Nhưng đừng lo lắng, bởi vì:

  • Hầu như các macro có một định danh chữ hoa và hầu như không macro là chữ thường hoặc UpperAndLowerCase hoặc lowerAndUpperCase hoặc lower_case_and_underscore ...

  • Nếu một macro là được định nghĩa lại, trình biên dịch sẽ cung cấp cho bạn một cảnh báo. Vì vậy, bạn không cần phải lo lắng về macro tên.

Cách này cũng áp dụng cho windows.h và một số thư viện khác, nhưng không thể áp dụng cho hầu hết thư viện chuẩn C/C++.

+0

Cảm ơn bạn, đánh dấu aswer :) – MattMatt

+0

nhưng vấn đề là tôi sử dụng glew ... gần như tất cả mọi thứ được định nghĩa là một vĩ mô ... – MattMatt

+0

@MattMatt Tôi nghĩ rằng bạn không cần phải lo lắng về điều này. Bởi vì: 1. Hầu hết các macro là COMPLETELY_UPPERCASE (phải không?), Có bất kỳ số nhận dạng không vĩ mô nào có thể có cùng tên không? 2. Nếu một macro đang được định nghĩa lại, trình biên dịch sẽ cảnh báo bạn. – DMaster

1

Rõ ràng, có thể thực hiện được với thư viện C thuần túy. Tuy nhiên, đó có lẽ không phải là một ý tưởng tốt để làm.

Theo như tôi biết, C++ không cung cấp các tiện ích cho những gì bạn đang cố gắng làm. Lựa chọn tốt nhất của bạn là chỉ đưa các tệp vào trong tệp nguồn thay vì tệp tiêu đề, ít nhất là đối với API được hiển thị công khai. Bằng cách này, không nên có bất kỳ xung đột nào, miễn là không có bất kỳ xung đột nào giữa các thư viện mà bạn đang đưa vào trong một tệp nguồn duy nhất. Nếu vẫn còn xung đột, bạn sẽ phải bao bọc các mục bạn đang sử dụng trong tiêu đề xung đột riêng lẻ.

Ngoài ra, bạn có thể xem xét đặt các lớp của riêng mình trong một không gian tên để giảm cơ hội xung đột.

+0

Có, tôi không biết nếu tôi có một sự lựa chọn sau đó ... – MattMatt

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