2010-07-02 2 views
3

В настоящее время мы создаем API для определенной библиотеки. Часть интерфейса требует, чтобы библиотека получала и возвращала пользовательские классы, такие как вектор и строка.Передача std :: string в библиотеке API

При попытке имитировать использование библиотеки в простом сценарии, в режиме отладки система подавляется при доставке строки в качестве ввода.

Я считаю, что существует другое представление строкового класса в режиме отладки или выпуска. Тогда наша библиотека предполагает получить определенное представление, неправильно прочитать член данных и раздавить по пути. Итак, каков наилучший способ передачи объектов STL в API. Мишень ОС Виндоус XP скомпилирован с MSVC 8, хотя пользователь библиотеки будет использовать окна их компилятор может (и, вероятно, будет) отличаться Идеи, которые мы имели до сих пор:

  1. Изменение строки на символ * - Но тогда разработчики могут сбивать с толку ответственность за освобождение памяти.
  2. Используйте нашу собственную версию String - я не хочу разрабатывать другую частную реализацию строки.
  3. Отпустите версию отладки и версию отладки.
  4. Спросите людей о переполнении стека для какой-то опции, которую мы пропустили или не понимаем, или просто услышать от их опыта - сделано.
+2

Вы верите, что есть другое представление или вы знаете, что есть? –

+0

@Neil: хорошая точка. Вы знаете больше об этом? Тем не менее, даже если между выпуском и отладкой нет никакой разницы, все еще сомнительно использовать STL в API, используемом третьими лицами IMHO. – Wizard79

+0

И если ваша библиотека получает объект, который будет содержать данные, которые должны быть доставлены. Таким образом, нет риска выпуска данных памяти. – lsalamon

ответ

5

Вам не следует пропускать объекты STL между различными двоичными модулями.

Для строки, вы должны полагаться на const char* только для чтения параметров и char*, <buffer size> для входных параметров ...

Для векторов, это может быть немного сложнее, особенно если вы должны изменить содержание вектора ...

О ваших идей:

  1. вы правы, но соглашение, как правило, является то, что вы не можете сохранить переданный указатель (вы должны сделать свою локальную копию).
  2. В конце у вас будет такая же проблема, если у вас нет того же двоичного представления для отладки и выпуска версии вашей реализации.
  3. Это может быть вредным, если вы используете разные версии/реализацию STL в двух двоичных модулях (если вы не уверены, что пользователь библиотеки будет использовать один и тот же STL).
+1

Для проголосовавших: просьба добавить пояснительный комментарий, чтобы мы могли понять, что не так ... – Wizard79

+0

Пожалуйста, объясните, что вы подразумеваете под «двоичными модулями». –

+0

@Neil: например .exe и .dll, или статически связанная библиотека, или вообще любые два скомпилированных модуля, которые будут связаны друг с другом. Если они используют разные реализации STL ... opps. – Wizard79

7

Это не является необоснованным, чтобы люди связывались с отладкой в ​​режиме отладки и освобождались в режиме деблокирования. Вот как это делает каждая библиотека. Даже такие огромные проекты, как DirectX, отлаживают компиляции своих двоичных файлов. # 3 - вполне разумный вариант/решение.

+0

Но это не так разумно, чтобы заставить конкретную версию STL IMHO ... – Wizard79

+0

@Lorenzo: Вы используете STL своего компилятора. Если у вас есть бесплатный компилятор, такой как GCC, то вы обновляете своих пользователей. Если у вас есть платный, более версированный компилятор, такой как MSVC, вы просто компилируете его с MSVC8,9,10. – Puppy

+0

@DeadMG: но если вы скомпилируете свою библиотеку с данным компилятором, если вы экспортируете объекты STL, вы заставите пользователя библиотеки использовать ту же среду в своем приложении. – Wizard79

 Смежные вопросы

  • Нет связанных вопросов^_^