Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Типы в общедоступном C++ API

Автор вопроса: cairolОтветов: 3

Я пишу библиотеку и задаюсь вопросом, что лучше всего использовать для типов данных, используемых в общедоступном API.

Учитывая функцию

void foo (int bar)

который ожидает индекс для некоторого внутреннего массива/контейнера. Какой это должен быть тип? Поскольку индекс никогда не может быть отрицательным, я мог бы использовать unsigned int или size_t. Или я должен придерживаться простого int и утверждать / бросать, если указано какое-то недопустимое значение?

В общем: следует ли выбирать тип на основе допустимого диапазона данных (например, чтобы избежать отрицательных проверок) или нет?

РЕДАКТИРОВАТЬ: другой пример, предположим, что моя библиотека предоставляет функцию для печати файла. Пользователь может выбрать диапазон страниц для печати:

void print (int page_from, int page_to)

c++apitypes

Ответы

Ответ 1 · рейтинг 2 · AnT

Если массив/контейнер, о котором вы говорите, является просто общим абстрактным массивом, независимым от приложения, то наиболее подходящим типом будет size_t. Конечно, вы можете указать typedef имя для типа в вашем интерфейсе. Опять же, это уместно только тогда, когда вы работаете с абстрактными массивами, например, в общей библиотеке контейнеров или общей функции сортировки и т. д.

Когда вы попадаете в конкретную область приложения, size_t больше не является подходящим типом. В области вашего приложения этот индекс обычно имеет некоторую специфичную для приложения семантику, не связанную непосредственно с массивами. Например, это может быть какой-то "идентификатор сотрудника", или "номер сотового", или "цветовой индекс", или что-то еще. В таких случаях у вас обычно уже есть предварительно выбранный целочисленный тип для представления соответствующего количества. (И выбор обычно не будет иметь ничего общего с массивами.) Это именно тот тип, который вы должны использовать в своем интерфейсе.

Что касается знаковости/беззнаковости типа... Я, например, твердо верю, что беззнаковые величины должны быть представлены беззнаковыми типами, т.е. нормальный индекс массива должен быть беззнаковым.

Ответ 2 · рейтинг 1 · Pavel Minaev

Лучшим советом здесь, вероятно, будет придерживаться существующей практики (т.е. того, что делают стандартные библиотеки C++). Вообще говоря, это означает, по крайней мере, использование здесь типа unsigned; если вы на самом деле используете этот тип непосредственно как индекс массива/указателя (и ваша абстракция прозрачна в этом отношении), то может потребоваться size_t.

Если foo является функцией-членом некоторого класса, похожего на контейнер, то вы также можете подумать о том, чтобы typedef создать что-то вроде size_type и использовать его.

Ответ 3 · Drakosha

Я голосую за использование unsigned. Еще лучше используйте stdint.h и что-то вроде uint32_t.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы