Типы в публичном API C ++ - PullRequest
       45

Типы в публичном API C ++

2 голосов
/ 03 декабря 2009

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

С учетом функции

void foo (int bar)

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

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

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

void print (int page_from, int page_to)

Ответы [ 3 ]

2 голосов
/ 03 декабря 2009

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

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

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

1 голос
/ 03 декабря 2009

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

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

0 голосов
/ 03 декабря 2009

Я голосую за использование без знака. Более того, используйте stdint.h и используйте что-то вроде uint32_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...