Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одинаковые структуры, конфликт имен 
:(
    Опции темы
tofreesky
Дата 18.3.2012, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



foo.cpp

Код

#include "lib1.h"
#include "lib2.h"

int main()
{
 return lib1_func(1) + lib2_func(1);
}


lib1.cpp
Код

#include "lib1.h"

int lib1_func(SM _struct_)
{
 return _struct_.b1 + _struct_.b2;
}


lib1.h
Код


#if !defined(__LIB1_H__)
 #define __LIB1_H__
 
 typedef struct _SomeStruct {
    int b1;
    int b2;
 } SM;
 
 int lib1_func(SM _struct_);
#endif


lib2.cpp
Код

#include "lib2.h"

int lib2_func(SM _struct_)
{
 return _struct_.b1 - _struct_.b2;
}


lib2.h
Код

#if !defined(__LIB2_H__)
 #define __LIB2_H__
 
 typedef struct _SomeStruct {
    int b1;
    int b2;
 } SM;
 
 int lib2_func(SM _struct_);
#endif


Естественно возникает конфликт:
l
Код

ib2.h:4: error: redefinition of `struct _SomeStruct'
lib1.h:4: error: previous definition of `struct _SomeStruct'


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

Помимо уникальных имен и неймспейсов?
PM MAIL   Вверх
boostcoder
Дата 19.3.2012, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(tofreesky @  18.3.2012,  23:42 Найти цитируемый пост)
в заголовочном файле которых присутствуют одинаковые структуры?

вынести в отдельный хидер.
PM WWW   Вверх
Dem_max
Дата 19.3.2012, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



поместить структуры каждый в свой namespace


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
borisbn
Дата 19.3.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



можно ещё так попробовать
Код

#if !defined( _SOME_STRUCT_DEFINED_ ) 
  #define _SOME_STRUCT_DEFINED_
  typedef struct _SomeStruct {
     int b1;
     int b2;
  } SM;
#endif

в обоих h-никах


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 19.3.2012, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Dem_max @  19.3.2012,  06:34 Найти цитируемый пост)
поместить структуры каждый в свой namespace

и теряем ODR.

Цитата(borisbn @  19.3.2012,  08:51 Найти цитируемый пост)
можно ещё так попробовать <...> в обоих h-никах

так же, теряем ODR. и в случае вкравшейся опечатки, получаем вероятность использовать две разных декларации структуры.

Это сообщение отредактировал(а) boostcoder - 19.3.2012, 11:41
PM WWW   Вверх
mes
Дата 19.3.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



boostcoder, borisbn, вопрос на засыпку.. а что делать если править хидеры нельзя ?
smile

Добавлено @ 12:33
Цитата(boostcoder @  19.3.2012,  10:40 Найти цитируемый пост)
так же, теряем ODR....

разве  ?   , а с продолжением цитаты полностью согласен


Это сообщение отредактировал(а) mes - 19.3.2012, 12:36


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.3.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  19.3.2012,  12:32 Найти цитируемый пост)
а что делать если править хидеры нельзя ?

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

Цитата(mes @  19.3.2012,  12:32 Найти цитируемый пост)
разве  ?

по сути, декларации-то у нас все равно получится две.
PM WWW   Вверх
mes
Дата 19.3.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  19.3.2012,  11:44 Найти цитируемый пост)
тогда их нужно инклудить в свой хидер, и там разруливать.

если мы их оба съинклудим, то конфликт имен... 

Цитата(boostcoder @  19.3.2012,  11:44 Найти цитируемый пост)
по сути, декларации-то у нас все равно получится две.

в одной единице ? как если страж стоит ?
в разных ? а когда мы инклудим один и тот же хидер в разные единицы, у нас также две декларации получаются smile 




--------------------
PM MAIL WWW   Вверх
borisbn
Дата 19.3.2012, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  19.3.2012,  12:49 Найти цитируемый пост)
если мы их оба съинклудим, то конфликт имен... 

можно инклюднуть так
Код

namespace NS1 {
#include "file1.h"
}

namespace NS2 {
#include "file2.h"
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 19.3.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  19.3.2012,  12:49 Найти цитируемый пост)
если мы их оба съинклудим, то конфликт имен...

ну да. тогда инклудить по условию.

Цитата(mes @  19.3.2012,  12:49 Найти цитируемый пост)
как если страж стоит ?

страж не спасет от отпечатки и ошибки копипаста.

Цитата(mes @  19.3.2012,  12:49 Найти цитируемый пост)
когда мы инклудим один и тот же хидер в разные единицы, у нас также две декларации получаются

ну да. сдаюсь smile 
PM WWW   Вверх
mes
Дата 19.3.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



borisbn, 
1. и  ошибка линковки smile
2.структура одна и та же и функции из разных либ должны уметь с ней работать..

Добавлено через 3 минуты и 7 секунд
Цитата(boostcoder @  19.3.2012,  11:54 Найти цитируемый пост)
страж не спасет от отпечатки и ошибки копипаста.

ага, но это в так и так лежит на плечах программиста.. и С++ со своим механизмом инклюдов тут не помощник.. 
для этого (для того чтоб избежать опечатки, но не дублирования копипаста) и выносятся общие описания в отдельный хидер.

Добавлено через 7 минут и 33 секунды
Цитата(boostcoder @  19.3.2012,  11:54 Найти цитируемый пост)
ну да. сдаюсь 

не верю... 

еще раз условие :

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

нам нужно иметь возможность в нашей единице пользоваться как функциями этих библиотек, так и самой структорой.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.3.2012, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, декларация структуры защищена стражами? именно декларация структуры, а не всего тела хидера.
PM WWW   Вверх
mes
Дата 19.3.2012, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  19.3.2012,  14:23 Найти цитируемый пост)
декларация структуры защищена стражами? именно декларация структуры, а не всего тела хидера. 

увы, нет.. составители библиотек не сильно заботились о пользователях  smile 


--------------------
PM MAIL WWW   Вверх
tofreesky
Дата 19.3.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



Что такое ODR?

По поводу нейм спейсов я говорил, что кроме этого способа и стражев как-то еще можно?

Цитата

вынести в отдельный хидер. 


Что за извращение, зачем чужие либы редактировать? Оттуда что-то вытаскивать, вставлять в другой.


Выходит кроме неймспейсов нет целесообразного способа. А если язык не С++ а С?
PM MAIL   Вверх
mes
Дата 19.3.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



tofreesky, составить свои хидеры, их и использовать


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.