2008-10-10 26 views
5

Modern derleyicilere (yani bildiğim kadarıyla söyleyebilirim ad alanları kullanmaz) portuna eski kütüphane çalışıyorum. Hedeflerimden biri, System :: TObject ve :: TObject (ad alanı olmayan) arasındaki farkı söyleyemez. Sistem :: Tobject derleyiciye özgüdür.Eski kod taşırken sınıf adı çakışması nasıl ele alınır?

Ben kullanarak yönergesi denedim

, yani kullanarak :: TObject;

Ama bu bunu yapmaz.

bariz çözüm belirsizlik kaçınmalıdır name- bunu çağırarak sonra tüm orijinal bir ad alanında kütüphane ve sarılmasıdır. Ama bu en akıllı çözüm mü? başka bir çözüm var mı? Bir ad ekleme dosyaların bir demet değişen gerektirecektir ve daha sonra istenmeyen yansımaları olurdu bilmiyorum.

#define TObject TMadeUpNameObject 

cevap

0

, belki her kaynağının başında bir başlık dosyası içerir Tüm eski işlevler için bir sarmalayıcı yapın ve bunları bir DLL veya statik kitaplığa paketleyin.

0

bu deneyin:

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

bu derleyici 'çözülmemiş dış sembol sonuçlanan eski kütüphanede mevcut olmayacaktır oldlib tarafından öneki sembolleri, oluşturacaktır "kamu: __thiscall oldlib :: A :: ~ A (boşluk)"(? ? 1A @ oldlib @@ QAE @ XZ) ' – xtofl

1

Sen yaparsın kütüphaneye kaynak varsa o başlık dosyası sadece sahip olduğu

0

Ben kodu ile çarpışan sınıfları içeren bir üçüncü taraf başlık dosyası enkapsüle ederken geçmişte şu kullanmış:

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

Bu şekilde, başlığında "Sembol" ÜçüncüTaraf tarafından öneki ve bu değildi benim kodumla çarpışıyor.

3

Dib önerildiği gibi Sen ufak bir değişiklikle, yapabilirsiniz: Bu veriyor

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

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

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE 
using namespace oldlib; 
#endif 

Eğer çatışmaları alıyoruz nerede sadece dosyalarda dışlanmayı #define ve küresel sembolleri olarak bütün sembolleri kullanmak aksi takdirde.

İlgili konular