@exvel

Как принято понимать параметр size в функциях C/C++?

Для меня C++ не родной язык. По долгу службы пишу DLL на С++.
В некоторых функциях нужно принимать/возвращать массивы данных или юникодовые строки.
Так как это библиотека, то типы std::vetor и std::wstring использовать в интерфейсе не могу (непортабельны).
Использую старый C синтаксис. К примеру, возврат строки:
void Foo(wchar_t *buffer, int size) { ... }
Собственно вопрос.
Что принято понимать под параметром size в примере выше: количество элементов в массиве или реальный размер в байтах?
В коде выше размер в байтах в 2 раза больше, чем количество элементов в массиве, поэтому желательно не гадать, а использовать "как все".
И еще, следует ли использовать, вместо int, макрос size_t? Не думаю, что он будет различаться от компилятора к компилятору, зато точнее передаст смысл параметра.
  • Вопрос задан
  • 9113 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Размер в байтах используется чаще тогда, когда обмен идёт неструктурированными данными, или данными с элементами переменной длины. Обычно указатель на данные при этом типа void *.
При обмене массивами с элементами фиксированного размера обычно удобнее использовать количество элементов.
Ответ написан
@DancingOnWater
Позволю дополнить ответ @jcmvbkbc

Начну с того, что когда вы программируете на C\C++, то код стоит воспринимать в терминах выделение\освобождения памяти и операций с оной.

Теперь к нашим баранам. Исторически сложилось, что базовые типы в C++ не имеют фиксированный длины, кроме char. Одновременно в голом Си нет никаких безопасных контейнеров и итерация возможна только с помощью голой арифметике указателей. А в стандарте сказано, что прибавлению к указателю числа n означает его смещение на n*sizeof(T) байт.

Отсюда вывод, параметр size = length/sizeof(T), где length - это размера куска памяти в байтах.

Замечу, что ответ является первым приближением к правильному, т.к. не рассмотрен случай не выровненного буфера, битовые поля и некоторые экзотические случаи, но в целом логика сохраняется.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
morozovdenis
@morozovdenis
размер буфера

int Foo(wchar_t *buffer, int size) { ... }

...

wchar_t buffer[256];
int size = Foo(buffer, 256);
while (size > 0)
{
    //пока size больше 0 функция что-то возвращает
    size = Foo(buffer, 256);
}
Ответ написан
donkaban
@donkaban
Умею рисовать тени
Слегка в сторону. Что будет, если вы передаете буфер long[size], записаный на машине с big-endian, а читаете поэлементно... ну ясно, да? Если вы пишете библиотеку, то атом сериализации - это все-таки байт. :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы