Основные типы, чтобы выставить на C ++ API - PullRequest
7 голосов
/ 27 февраля 2011

Я нацеливаюсь на Windows, но не вижу причин, по которым какой-то код API, который я пишу, не может использовать базовые типы C ++. То, что я хочу сделать, это выставить методы, которые возвращают строки и целые числа. В мире C # я бы просто использовал строку и имел строку в юникоде, но в VC ++ у меня есть возможность использовать std :: string, std :: wstring или MFC / ATL CStrings.

Должен ли я просто использовать std :: wstring исключительно для поддержки юникода, или я могу использовать std :: string, который будет скомпилирован в юникод на основе моих настроек сборки? Я склоняюсь к последнему. Я бы предпочел предоставить методы Get [Item] AsCString () для моих объектов для других типов строк.

Также я должен использовать size_t вместо целого числа?

API будет использоваться мной и, возможно, будущим разработчиком, работающим над C ++ GUI. Это способ разделить проблемы. Мои предпочтения:

  • Интуитивность для других разработчиков.
  • Прямая совместимость с VC ++
  • Совместимость с другими компиляторами C ++
  • Производительность (это меня меньше беспокоит, но нужно время запуска для остальной части моего приложения)

Любые гиды будут оценены.

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Вы, вероятно, должны придерживаться типа строки STL. Класс Mtc CString в любом случае построен поверх этого.

Как отмечалось ранее, использование wstring не является волшебной палочкой для решения проблем Unicode, поскольку существует много символов Unicode, для которых все еще требуется несколько символов wchars для кодирования.

Использование Utf-8 имеет потенциальные преимущества (например, вам не нужно беспокоиться о порядке байтов).

В Windows все современные ядра основаны на wchar, поэтому при использовании 8-разрядных версий API-интерфейсов возникают (минимальные) накладные расходы.

1 голос
/ 28 февраля 2011

Использование std :: wstring / string вместо MFC CString позволит вам перенести ваш код на другие каркасы (например, Qt для Windows).

Даже при использовании std :: string вы можете кодировать строкив UTF-8, поэтому ваш API по-прежнему сможет возвращать строки UNICODE.Имейте в виду, что даже wstring действительно является UTF-16, а не полным 32-битным UNICODE (в то время как в некоторых операционных системах wstring является UTF-32).

1 голос
/ 27 февраля 2011

В вашей ситуации мне понадобится несколько часов / дней, чтобы выработать свое мнение и принять решение.Прежде всего, я очень предпочитаю C_API C ++ _ API, даже для кода C ++.Тогда ответ будет char *, или wchar *, или TCHAR *.Теперь попробуйте угадать, действительно ли вы ожидаете, что вам понадобится UNICODE.Подавляющее большинство моих проектов (в том числе с графическим интерфейсом) не нуждались в UNICODE, простоту и привычность простых C-массивов часто трудно превзойти.

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

Последнее: чтобы ответить на ваш вопрос более прямо, я бы начал с std :: string в качестве первого выбора для оценки.Если я не найду какое-либо преимущество в предложении в пользу других вариантов, я останусь с ним.

...