2008-10-10 23 views
5

Tôi đang cố gắng chuyển một thư viện cũ (không sử dụng các không gian tên theo như tôi có thể biết) cho các trình biên dịch hiện đại. Một trong những mục tiêu của tôi không thể nói sự khác biệt giữa System :: TObject và :: TObject (không có vùng tên). Hệ thống :: TObject có nguồn gốc từ trình biên dịch.Làm cách nào để xử lý xung đột tên lớp khi chuyển mã cũ?

Tôi đã thử sử dụng chỉ thị, tức là sử dụng :: TObject;

Nhưng điều đó không thực hiện được.

Giải pháp hiển nhiên là bọc tất cả thư viện ban đầu vào một không gian tên và sau đó gọi nó theo tên - nên tránh sự mơ hồ. Nhưng đó có phải là giải pháp khôn ngoan nhất? Còn có những giải pháp nào nữa ko? Thêm một không gian tên sẽ yêu cầu thay đổi một loạt các tập tin và tôi không biết nếu nó sẽ có hậu quả không mong muốn sau này.

Trả lời

0

Nếu bạn có nguồn gốc đến thư viện, có thể bao gồm một tập tin tiêu đề ở đầu mỗi nguồn nơi mà tập tin tiêu đề chỉ có:

#define TObject TMadeUpNameObject 
0

Hãy thử điều này:

namespace oldlib 
{ 
    #inclcude "oldlib.h" 
}; 
+0

điều này sẽ làm cho trình biên dịch tạo ký hiệu tiền tố bằng oldlib, sẽ không có trong thư viện cũ, dẫn đến 'biểu tượng bên ngoài chưa được giải quyết": __thiscall oldlib :: A :: ~ A (void) "(? ? 1A @ oldlib @@ QAE @ XZ) ' – xtofl

1

Bạn có thể làm cho một wrapper cho tất cả các chức năng cũ và gói chúng thành một DLL hoặc thư viện tĩnh.

0

Tôi đã sử dụng sau đây trong quá khứ khi đóng gói một tập tin header của bên thứ ba có chứa các lớp học va chạm với các mã:

#ifdef Symbol 
#undef Symbol 
#define Symbol ThirdPartySymbol 
#endif 
#include <third_party_header.h> 
#undef Symbol 

Bằng cách này, "Symbol" trong tiêu đề là tiền tố của Bên thứ ba và đây không phải là va chạm với mã của tôi.

3

Bạn có thể làm như Dib đề nghị, với một sửa đổi nhỏ:

// In a wrapper header, eg: include_oldlib.h... 

namespace oldlib 
{ 
    #include "oldlib.h" 
}; 

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE 
using namespace oldlib; 
#endif 

này cho phép bạn # define loại trừ trong chỉ các tập tin mà bạn đang nhận được xung đột, và sử dụng tất cả những biểu tượng như biểu tượng toàn cầu nếu không thì.

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