С++ вопрос

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

С++ вопрос

Post by uniqueman »

Встала проблема (одним местом чувствую будет еще хуже).

У меня есть две библиотеки. Обе надо использовать в приложении. В хедере одной либы есть такое определение

typedef struct MESSAGE
{
};

в хедере другой такое

union MESSAGE
{
};

при включении обоих хедеров вылетает ясен пень ошибка компиляции про переопределение типов.

Использовать либы надо обязательно. Перекомпилировать не могу либы, они не мои. Пытаюсь найти способ не использолвать оба хедера в одном СРР, но пока безрезультативно.

Есть ли какой то способ?

Пытаюсь прикрутить паттерн Адаптор...

Спасибо
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Как на счет
define MESSAGE MESSAGE1 в одном из заголовков?
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
spellbound
Уже с Приветом
Posts: 144
Joined: 10 Dec 2003 01:01
Location: Los Angeles, CA

Post by spellbound »

А что, если попробовать использовать 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...

Не знаю, будет ли работать, но попробуйте...
Last edited by spellbound on 25 Feb 2004 17:37, edited 1 time in total.
User avatar
cityzen
Уже с Приветом
Posts: 3759
Joined: 11 Feb 2004 13:37

Re: С++ вопрос

Post by cityzen »

uniqueman wrote:Встала проблема (одним местом чувствую будет еще хуже).

У меня есть две библиотеки. Обе надо использовать в приложении. В хедере одной либы есть такое определение

typedef struct MESSAGE
{
};

в хедере другой такое

union MESSAGE
{
};

при включении обоих хедеров вылетает ясен пень ошибка компиляции про переопределение типов.

Использовать либы надо обязательно. Перекомпилировать не могу либы, они не мои. Пытаюсь найти способ не использолвать оба хедера в одном СРР, но пока безрезультативно.

Есть ли какой то способ?

Пытаюсь прикрутить паттерн Адаптор...

Спасибо


С помощью тесктового редактора одном из заголовков замените все вхождения MESSAGE на что нибудь другое.
One small step for me ...One giant leap for.. A frog?
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

spellbound wrote:А что, если попробовать использовать namespaces?


Ага, а линковщику вы как объясните новые имена?
У человека нет возможности перекомпилить библиотку
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
cityzen
Уже с Приветом
Posts: 3759
Joined: 11 Feb 2004 13:37

Post by cityzen »

Strannik223 wrote:
spellbound wrote:А что, если попробовать использовать namespaces?


Ага, а линковщику вы как объясните новые имена?
У человека нет возможности перекомпилить библиотку


Линковщик ничего не знает про то, какое имя у union, если он, конечно, не external. Вот пусть у union и меняет. И не факт, что библиотеки написанs C++. Пусть пробует. Попытка не пытка (c) Берия.
One small step for me ...One giant leap for.. A frog?
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

поменять просто вхождение названия переменной на другое в хедере не помогла. Линковщик тут же заорал, что он ждет от меня совсем другой тип переменной. Вот нашел как решение.. Проблема была в том, что в главный СРР приложения включалось два хедера. Один из них явно был "вражеский" и все портил. Встала задача не включать хедер, но использовать библиотеку.

Написал новый хедер

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(); // этот вызов перенаправит запрос функции из либы, это
уже можно делать


Таким образом избавились от вражеского хедера, но сохранили возможность вызывать либу.

Return to “Вопросы и новости IT”