Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Условия успешной компиляции STL разными компил.


Автор: EnergoHokum 4.5.2008, 09:06
Хочу спросить: какие действия нужно предпринять (и нужно ли), чтобы код с использованием STL компилировался разными компиляторами (если он будет ещё и работать -- вообще идеально). То-есть, если я собираю GCC-ом вот такое,
Код

int Function(const std::multimap<std::string,std::string>& functionParam)
{
    //всякое разное
}

будет ли оно нормально работать под MSVC, на разных платформах (x86-32, x86-64)? Что нужно сказать компилятору (выравнивание, проч.)?

Автор: Daevaorn 4.5.2008, 10:02
100% гарантий дать не возможно. А условий всего 2:
- код должен быть как можно более близок к стандарту
- компилятор должен быть как можно более соответствующий стандарту

Автор: EnergoHokum 4.5.2008, 10:15
То-есть "опыт, сын ошибок трудных"? Мне предлагают преобразовать эту мультикарту в массив C-строк и передавать указатель на него, но мне такое "решение" не нравится сильно.

Автор: vinter 4.5.2008, 10:39
Цитата(EnergoHokum @  4.5.2008,  10:06 Найти цитируемый пост)
будет ли оно нормально работать под MSVC, на разных платформах (x86-32, x86-64)

будет

Автор: just_geek 4.5.2008, 10:59
Лучше перестраховатся и воспользоватся STLport'ом.

Автор: JackYF 4.5.2008, 11:42
Блин, да что в этом элементарном коде может не скомпилиться? При условии, что MSVC >= 7.0, проблем быть не должно 99,9%.

Автор: EnergoHokum 4.5.2008, 12:27
Я немного неправильно понял условия (и, соответственно, выразился). Правильнее так: если код, передающий мультикарту, скомпилирован одним компилятором (пусть MSVC), а принимающий -- другим (MinGW-GCC)могут-ли различия в реализациях STL-евских контейнеров испортить мне жизнь? Как я помню, на именно реализацию контейнеров ограничения не накладываются.

Автор: JackYF 4.5.2008, 14:11
Цитата(EnergoHokum @  4.5.2008,  11:27 Найти цитируемый пост)
Правильнее так: если код, передающий мультикарту, скомпилирован одним компилятором (пусть MSVC), а принимающий -- другим (MinGW-GCC)могут-ли различия в реализациях STL-евских контейнеров испортить мне жизнь?

Вот тут >50%, что испортят. Конечно, реализации разные. И тут уже надо пользоваться либо сериализацией, либо одинаковыми компиляторами, либо возвращаться к примитивам.

Автор: vinter 4.5.2008, 14:14
JackYF, поведение контейнеров стандартизировано. И его методы будут вести себя что в гцц что в мцц, одинаково. Реализация контейнера по моему волновать юзера должна ровно настолько, насколько обычного жителя города волнует проблема надоев в Псковской губернии.

Автор: EnergoHokum 4.5.2008, 14:48
To vinter: На RSDN-е есть руководство по STL, написанное Степановым и Ли, там приводится примеры для контейнеров, в частности для std::multimap. Эти примеры являются эталонной реализацией, или контора-производитель (КПр) может их корёжить по своему? Другими словами, КПр может добавить/урезать какие-нить внутренние служебные переменные контейнера? Функции?

Автор: JackYF 4.5.2008, 15:51
Цитата(vinter @  4.5.2008,  13:14 Найти цитируемый пост)
поведение контейнеров стандартизировано.

Поведение, но не бинарное представление, которое при передаче параметров будет давать феерические глюки.

Цитата(EnergoHokum @  4.5.2008,  13:48 Найти цитируемый пост)
или контора-производитель (КПр) может их корёжить по своему? Другими словами, КПр может добавить/урезать какие-нить внутренние служебные переменные контейнера? Функции? 

Конечно, может, и даже очень нужет smile Стандартизирован лишь интерфейс и стандарт поведения.

Автор: EnergoHokum 4.5.2008, 16:03
То-есть, получается, что для корректной передачи содержимого контейнеров разных КПр мне нужно вручную вынуть это содержимое из одного контейнера, и так-же вручную затолкать в другой (STLPort не рассматриваем)? 

Автор: vinter 4.5.2008, 17:51
Цитата(JackYF @  4.5.2008,  16:51 Найти цитируемый пост)
Поведение, но не бинарное представление, которое при передаче параметров будет давать феерические глюки.

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

Автор: mes 4.5.2008, 18:19
Цитата(vinter @  4.5.2008,  17:51 Найти цитируемый пост)
а причем тут бинарное представление? мы его по битам разбираем используя конкретные смещения? мы используем интерфейс, который будет работать всюду. Если я не прав, то приведи пример. 


При использовании двух описаний класса (а в случае с двумя компиляторами иного предполагать не логично)
 -  смещения будут подсчитаны по разному ( хотя бы если переменные стоят не в том порядке).

Чтоб избежать проблем между передачей данных между одинаковыми классами разных описаний можно:

1. использовать  "чистые" абстрактные классы 
2. передавать данные как с-блок 
3. использовать общий прокотол передачи данных.



Автор: vinter 4.5.2008, 18:22
все понял о чем вы smile

mes, JackYF, +1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)