Встала проблема (одним местом чувствую будет еще хуже).
У меня есть две библиотеки. Обе надо использовать в приложении. В хедере одной либы есть такое определение
typedef struct MESSAGE
{
};
в хедере другой такое
union MESSAGE
{
};
при включении обоих хедеров вылетает ясен пень ошибка компиляции про переопределение типов.
Использовать либы надо обязательно. Перекомпилировать не могу либы, они не мои. Пытаюсь найти способ не использолвать оба хедера в одном СРР, но пока безрезультативно.
Есть ли какой то способ?
Пытаюсь прикрутить паттерн Адаптор...
Спасибо
С++ вопрос
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 569
- Joined: 14 Dec 2003 04:06
- Location: Львов->Киев->Торонто
-
- Уже с Приветом
- Posts: 144
- Joined: 10 Dec 2003 01:01
- Location: Los Angeles, CA
А что, если попробовать использовать namespaces?
Например, перед #include одного файла написать
namespace message1 {
#include <file_where_struct_MESSAGE_is_defined.h>
}
перед другим:
namespace message2 {
#include <file_where_union_MESSAGE_is_defined.h>
}
А потом использовать fully qualified names, например message1::MESSAGE и message2::MESSAGE...
Не знаю, будет ли работать, но попробуйте...
Например, перед #include одного файла написать
namespace message1 {
#include <file_where_struct_MESSAGE_is_defined.h>
}
перед другим:
namespace message2 {
#include <file_where_union_MESSAGE_is_defined.h>
}
А потом использовать fully qualified names, например message1::MESSAGE и message2::MESSAGE...
Не знаю, будет ли работать, но попробуйте...
Last edited by spellbound on 25 Feb 2004 17:37, edited 1 time in total.
-
- Уже с Приветом
- Posts: 3759
- Joined: 11 Feb 2004 13:37
Re: С++ вопрос
uniqueman wrote:Встала проблема (одним местом чувствую будет еще хуже).
У меня есть две библиотеки. Обе надо использовать в приложении. В хедере одной либы есть такое определение
typedef struct MESSAGE
{
};
в хедере другой такое
union MESSAGE
{
};
при включении обоих хедеров вылетает ясен пень ошибка компиляции про переопределение типов.
Использовать либы надо обязательно. Перекомпилировать не могу либы, они не мои. Пытаюсь найти способ не использолвать оба хедера в одном СРР, но пока безрезультативно.
Есть ли какой то способ?
Пытаюсь прикрутить паттерн Адаптор...
Спасибо
С помощью тесктового редактора одном из заголовков замените все вхождения MESSAGE на что нибудь другое.
One small step for me ...One giant leap for.. A frog?
-
- Уже с Приветом
- Posts: 569
- Joined: 14 Dec 2003 04:06
- Location: Львов->Киев->Торонто
-
- Уже с Приветом
- Posts: 3759
- Joined: 11 Feb 2004 13:37
Strannik223 wrote:spellbound wrote:А что, если попробовать использовать namespaces?
Ага, а линковщику вы как объясните новые имена?
У человека нет возможности перекомпилить библиотку
Линковщик ничего не знает про то, какое имя у union, если он, конечно, не external. Вот пусть у union и меняет. И не факт, что библиотеки написанs C++. Пусть пробует. Попытка не пытка (c) Берия.
One small step for me ...One giant leap for.. A frog?
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
поменять просто вхождение названия переменной на другое в хедере не помогла. Линковщик тут же заорал, что он ждет от меня совсем другой тип переменной. Вот нашел как решение.. Проблема была в том, что в главный СРР приложения включалось два хедера. Один из них явно был "вражеский" и все портил. Встала задача не включать хедер, но использовать библиотеку.
Написал новый хедер
Wrapper.h
сlass Wrapper
{
поместил сюда собвственные названия функций, которые будут использовать функций из библиотеки
void OpenConn();
}
Пишем тело.
Wrapper.cpp
#include <Злобный хедер.h> // вот тут уже врубаем либу
void Wrapper::OpenConn()
{
вызываем отсюда любые функции из либы, хедер уже есть
}
В главном хедере приложения
MainDialog.h
#include "Wrapper.h" // может включать, Wrapper.h ничего не знает о либе
class Main
{
private:
Wrapper wrapper;
}
В главном теле
MainDialog.cpp
............
wrapper.OpenConn(); // этот вызов перенаправит запрос функции из либы, это
уже можно делать
Таким образом избавились от вражеского хедера, но сохранили возможность вызывать либу.
Написал новый хедер
Wrapper.h
сlass Wrapper
{
поместил сюда собвственные названия функций, которые будут использовать функций из библиотеки
void OpenConn();
}
Пишем тело.
Wrapper.cpp
#include <Злобный хедер.h> // вот тут уже врубаем либу
void Wrapper::OpenConn()
{
вызываем отсюда любые функции из либы, хедер уже есть
}
В главном хедере приложения
MainDialog.h
#include "Wrapper.h" // может включать, Wrapper.h ничего не знает о либе
class Main
{
private:
Wrapper wrapper;
}
В главном теле
MainDialog.cpp
............
wrapper.OpenConn(); // этот вызов перенаправит запрос функции из либы, это
уже можно делать
Таким образом избавились от вражеского хедера, но сохранили возможность вызывать либу.