Как справиться с конфликтом имен классов при переносе старого кода?

Я пытаюсь перенести старую библиотеку (которая, насколько я могу судить, не использует пространства имен) на современные компиляторы. Одна из моих целей не может отличить System :: TObject от :: TObject (без пространства имен). System :: TObject встроен в компилятор.

Я пробовал использовать директиву using, т.е. using :: TObject;

Но этого не происходит.

Очевидное решение - обернуть всю исходную библиотеку в пространство имен, а затем вызвать ее по имени - это должно избежать двусмысленности. Но разве это самое мудрое решение? Есть ли другое решение? Добавление пространства имен потребует изменения кучи файлов, и я не знаю, будут ли это иметь нежелательные последствия позже.


person Logomachist    schedule 10.10.2008    source источник


Ответы (5)


Вы можете сделать так, как предложил Диб, с небольшими изменениями:

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

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

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif

Это позволяет вам # определить исключение только для файлов, в которых возникают конфликты, и использовать все символы как глобальные в противном случае.

person Nick    schedule 10.10.2008

Вы можете создать оболочку для всех старых функций и упаковать их в DLL или статическую библиотеку.

person Adam Pierce    schedule 10.10.2008

Если у вас есть источник библиотеки, можно включить файл заголовка в верхней части каждого источника, где этот файл заголовка содержит только:

#define TObject TMadeUpNameObject
person Jim Buck    schedule 10.10.2008

Попробуй это:

namespace oldlib
{
   #inclcude "oldlib.h"
};
person John Dibling    schedule 10.10.2008
comment
это приведет к тому, что компилятор создаст символы с префиксом oldlib, которых не будет в старой библиотеке, что приведет к unresolved external symbol "public: __thiscall oldlib::A::~A(void)" (??1A@oldlib@@QAE@XZ) - person xtofl; 10.10.2008

В прошлом я использовал следующее при инкапсуляции стороннего файла заголовка, содержащего классы, конфликтующие с кодом:

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

Таким образом, "Символ" в заголовке имел префикс ThirdParty, и это не противоречило моему коду.

person David Segonds    schedule 10.10.2008