Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57

Написание кроссплатформенной библиотеки на C++

02.01.2017, 14:46. Показов 5067. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Планируется написание кроссплатформенной библиотеки на C++ с возможностью подключения к C# для работы в Windows. В библиотеке будет функция, которая принимает строку как аргумент. Вопрос заключается в следующем какой тип данных из C++ лучше подойдет для работы со строками и как реализовать поддержку Unicode на Linux и Windows одновременно. Т.к. Unicode в данных системах отличается по размеру, занимаемому в памяти?
Пример планируемой функции:
C++
1
2
3
4
void StringReturn(wchar_t* str)
{
//Что-то выполняется...
}
Если имеются вопросы по теме задавайте постараюсь разъяснить. Заранее спасибо за ответы и помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.01.2017, 14:46
Ответы с готовыми решениями:

Создание 100% кроссплатформенной библиотеки
Случилось несчастье - мне необходимо написать приложение на UWP. Разумеется, проектирую все по модели MVC. Тестировать и разрабатывать...

Написание библиотеки
Требовалсь написать библиотеку на Си и подключить ее в делфи. В библиотеке реализовывалась функция удаления введенного символа из...

Написание библиотеки
Всем привет, расскажите плз, как написать свою библиотеку, а то что-то не могу понять. Если что, то моя IDE: Visual Studio 2010. P.S....

27
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
11.01.2017, 10:23
ANDANTINO,
Цитата Сообщение от ANDANTINO Посмотреть сообщение
Т.к. Unicode в данных системах отличается по размеру, занимаемому в памяти?
Unicode не может различаться, это стандарт, в Windows UCS-2 - 2 байта на символ фиксировано, это и есть wchar_t.
0
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
12.01.2017, 11:18  [ТС]
wmaster575, про то что вы написали я знаю. Меня интересует какой тип данных лучше взять на Linux, т.к. там Unicode не 2 байта? Все это нужно мне чтобы я мог определится с архитектурой библиотеки, и она могла работать и на Linux и Windows. Хотя Windows все же в большем приоритете чем Linux.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.01.2017, 11:33
Лучший ответ Сообщение было отмечено ANDANTINO как решение

Решение

Цитата Сообщение от ANDANTINO Посмотреть сообщение
Меня интересует какой тип данных лучше взять на Linux, т.к. там Unicode не 2 байта?
То просто уникод бывает разный бывает UTF-8 - символы помещающиеся в один байт занимают дин байт не помещающиеся 2 байта. а еще бывает UTF-16 и UTF-32. UTF-16 - двухбайтные символы UTF-32 четырехбайтные. ПРичем о операционки это не зависит. Другое дело с какого именно типа уникод принимают на выход/дают на выход API операционок. Разруливается такая проблема обычно подключением разных хидеров с разными typedef для char и string для разных операционок. (естественно что без перекомпиляции на разные целевые платформы оно вообще не жизнеспособно) Т.е. имеются обычно 4 типа строк - одни для Ansi вторая для UTF-8 третья для UTF-16 четвертая для UTF-32 и в зависимости от дефайна ОС string-ом назначается один из них.
2
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
12.01.2017, 14:35  [ТС]
Fulcrum_013, я вас правильно понял, что нужно учитывать с каким уникодом работает API ОС и в зависимости от этого назначать именно тот вид, который поддерживает API? И да тогда вопрос в этом случаи для определения разных типов строк нужно использовать макрос, если да, то не могли бы вы привести пример?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.01.2017, 14:48
Лучший ответ Сообщение было отмечено ANDANTINO как решение

Решение

НУ примерно вот так
C++
1
2
3
4
5
#ifdef __x64__
typedef string WideString;
#else
typedef string AnsiString;
#endif
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
13.01.2017, 11:52
Цитата Сообщение от wmaster575 Посмотреть сообщение
Windows UCS-2 - 2 байта на символ фиксировано, это и есть wchar_t.
Только wchar_t имеет разный размер в разных компиляторах.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
То просто уникод бывает разный бывает UTF-8
UTF-8 это не уникод.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.01.2017, 15:30
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
UTF-8 это не уникод.
UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-битный»
UTF-8
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Только wchar_t имеет разный размер в разных компиляторах.
Не в разных компиляторах а в разных таргетах. Так же как и size_t.
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
13.01.2017, 15:41
Лучший ответ Сообщение было отмечено ANDANTINO как решение

Решение

Fulcrum_013, не путайте UTF-8 и Юникод.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не в разных компиляторах а в разных таргетах.
Нет. В MS VC wchar_t 2 байта, в GCC 4. Если хотите в GCC 2 байта, то нужно компилировать с -fshort-wchar.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.01.2017, 16:18
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
не путайте UTF-8 и Юникод.
То вы что то путаете. Уникод это абстракция которая имеет смысл только в конкретном формате представления. Форматов представления существует три - UTF-8 UTF-16 и UTF-32
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Нет. В MS VC wchar_t 2 байта, в GCC 4. Если хотите в GCC 2 байта, то нужно компилировать с -fshort-wchar.
Честно сказать - мне лично глубоко пофиг какой размер wchar_t дает компилятор. У меня свои шаблонные строки где символом может быть любой тип даже класс (пользуется к примеру для задания множества символов алфавитов допустимых в системах генерации таблиц переключения состояний лексера и парсера метакомпилятора).
А если это имеет значение для таргета то нужный тип тайпдефится как основной вид строки и основной char.
Точно так же сделано во всех нормальных фреймверках за исключением того допустимый для строки символа обычно
typename а не class
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
13.01.2017, 16:32
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Уникод это абстракция которая имеет смысл только в конкретном формате представления.
Это ложное утверждение. Если стоит задача процессинга текста, то придется работать с UCS.

Fulcrum_013, всем фиолетово как у вас устроены строки. Задача стоит сделать библиотеку, которую можно дергать откуда угодно. Поэтому нужно учитывать способ хранения строк в памяти.
0
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
13.01.2017, 16:44  [ТС]
Fulcrum_013 и Dmitriy_M, подскажите как должен будет выглядеть следующий макрос в заголовочном фале. Сначала смотрим под какую ОС (Windows, Linux и т.д.) и какую кодировку будем использовать (Unicode или Ansi) и в зависимости от ОС и кодировки подключаем именно те функции, которые написаны именно для них. То есть под Windows одни функции Linux другие, и тоже самое с кодировкой для этих функций? Если не совсем понятно, что я хочу сделать, задавайте вопросы?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.01.2017, 16:44
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Задача стоит сделать библиотеку, которую можно дергать откуда угодно
Пользовать строки из фреймверка которые к эти делам адаптированы. Если нету фреймверка - сделать свои адаптированные строки.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
13.01.2017, 16:48
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Пользовать строки из фреймверка которые к эти делам адаптированы. Если нету фреймверка - сделать свои адаптированные строки.
Какие к черту фреймворки, когда строки будут передаваться между C/C++ и C#?
0
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
13.01.2017, 16:57  [ТС]
Друзья форумчане давайте не разводить пустых споров, а лучше обсуждать тему и отвечать на ее вопросы. Например:
Цитата Сообщение от ANDANTINO Посмотреть сообщение
Fulcrum_013 и Dmitriy_M, подскажите как должен будет выглядеть следующий макрос в заголовочном фале. Сначала смотрим под какую ОС (Windows, Linux и т.д.) и какую кодировку будем использовать (Unicode или Ansi) и в зависимости от ОС и кодировки подключаем именно те функции, которые написаны именно для них. То есть под Windows одни функции Linux другие, и тоже самое с кодировкой для этих функций? Если не совсем понятно, что я хочу сделать, задавайте вопросы?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.01.2017, 17:10
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Какие к черту фреймворки, когда строки будут передаваться между C/C++ и C#?
В каждом языке свой одинаково работающий с однотипными данными. А как еще данные между разными процессами можно передать? Только через одинаковый формат самих данных и библиотеки однообразно его обрабатывающие/преобразовывающие в/из свой формат в каждом процессе.
0
31 / 31 / 15
Регистрация: 02.02.2015
Сообщений: 152
13.01.2017, 20:36
ANDANTINO, примерно так:
C++
1
2
3
4
5
#ifdef UNICODE
#define MyFunc MyFuncUnicode
#else
#define MyFunc MyFuncNonUnicode
#endif
Если ещё для ОС:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifdef OS_LINUX
 
// Под linux.
#ifdef UNICODE
#define MyFunc MyFuncLinuxUnicode
#else
#define MyFunc MyFuncLinuxNonUnicode
#endif
 
#else
 
// Стандартно под windows.
#ifdef UNICODE
#define MyFunc MyFuncUnicode
#else
#define MyFunc MyFuncNonUnicode
#endif
Но здесь можно сделать так:
C++
1
2
3
4
5
6
7
8
9
#ifdef OS_LINUX
// Под linux.
#include "linux.h"
 
#else
// Стандартно под windows.
#include "windows.h"
 
#endif
И уже в каждом файле отдельно писать.

Можно не реализовывать функции для разных кодировок, в своей библиотеке за основу прими одну из кодировок, UCS-2 или другую. Все функции будут работать с ней. А функции для других кодировок будут вначале перекодировать данные в эту рабочую кодировку, а затем вызывать основную. То есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Основная функция.
int MyFuncUnicode(wchar_t *str)
{
    // Реализация основной функции.
    return 1;
}
 
// 
// Функция для другой кодировки.
int MyFuncNonUnicode(char *str)
{
    // Перекодировка.
    wchar_t *wstr = MyConvert(str);
    int res = MyFuncUnicode(wstr);
    // Удаляем строку, ресурсы.
    MyDestroy(wstr);
    // Возвращаем результат.
    return res;
}
Так сделано в Windows системах. Внутренне во всех функциях она использует UCS-2.
Либо же, чтобы была оптимизация, не каждый раз при вызовах приводить данные в нужную кодировку, а изначально их переконвертировать в зависимости от системы.
1
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
14.01.2017, 10:05  [ТС]
wmaster575, спасибо большое. Только поясните, что значит MyFunc и где он участвует в коде, а именно он где-то прописывается или определяется как переменная среды?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.01.2017, 11:45
Цитата Сообщение от ANDANTINO Посмотреть сообщение
Только поясните, что значит MyFunc и где он участвует в коде,
MyFun это и есть твоя функция которая принимает строки. Для каждого типа строки своя функция со своим суффиксом. НУ типа MyFuncA для ASCII строк MyFuncW для UTF-16 строк MyFuncU для UTF-32 строк. дефайном без суффикса подставляется нужная для целевого таргета функция. Это устаревший 25 лет назад сишный подход для которого все функции принимающие строки придется переделать подобным образом.
Для С++ уже более 20 лет обычно делается немного по другому. Делается для каждого типа строки класс. К примеру AnsiString для символов ANSI , WideString для строк UTF-16 и UnicodeStrung для UTF-32. При этом классы имеют общий интерфейс (обычно пораждены от одного общего шаблонного типа строки) и конструкторы/операторы присваивания конвертирующие один вид строк в другой. А потом дефайном в качестве String тайпдефится одна из них, а твои функции принимают на вход String. Т.е. фактически тоже самое только гораздо меньшим количеством кода и без легаси макрополстановок
0
5 / 5 / 1
Регистрация: 22.04.2015
Сообщений: 57
14.01.2017, 12:02  [ТС]
Fulcrum_013, я так понял это как функция WinApi SetWindowsText устроено.
C++
1
2
3
4
5
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
И в зависимости от того как сработает макрос та функция и отработает. Если так тогда вопрос, что я делаю не так в данном коде?
Dll.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#ifdef LIBDLL_EXPORTS
#define MATHFUNCSDLL_API extern "C" __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API extern "C" __declspec(dllimport) 
#endif
#ifdef UNICODE
#define TestApi MsgW
#else
#define TestApi MsgA
#endif 
 
MATHFUNCSDLL_API void MsgA(const char* str);
MATHFUNCSDLL_API void MsgW(const wchar_t* str);
Dll.cpp
C++
1
2
3
4
5
6
7
8
9
void MsgW(const wchar_t* str)
{
    MessageBoxW(NULL, str, L"", 1);
}
 
void MsgA(const char * str)
{
    MessageBoxA(NULL, str, "", 1);
}
Вроде бы библиотека собирается и нет ошибок, однако при попытке вызова макроса TestApi в C#, получаю ошибку что в dll не удается найти точку входа в функцию TestApi? А вот с функцией SetWindowsText такого нет. В чем причина?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2017, 12:02
Помогаю со студенческими работами здесь

Написание библиотеки Java
Прошу вашей помощи,мне по моему предмету в университете необходимо написать библиотеку на языке Java, задача такова - обработка текста:...

Написание библиотеки в С++ для вызова в C#
помогите никак не получается :( вот я создал проект dll, написал в .h-нике #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) ...

Написание библиотеки для воспроизведения MP3
Хочу вкупе своей программе добавить библиотеку для МР3. Можно ссылочек на то, как воспроизводить звук, и то, как устроен фаил? Если нужно...

Написание dll - библиотеки и ее открытие средствами Delphi
Есть некоторая dll-библиотека, которая вычисляет площадь и периметр n-угольника. Лабораторная была на Delphi, решил попробовать написать...

Как сделать программу кроссплатформенной?
Здавствуйте, обитатели форума. Я написал программу, которую нам задали на летней практике по информатике (1 курс), которая читает текстовые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru