Per una struttura dati con indici (ad esempio un elenco di array, un array dinamico, ecc ...), gli indici dovrebbero essere di tipo size_t
o int
? C'è una ragione chiara per usare l'una sull'altra?
fooGetByIndex(struct foo* foo, size_t index);
o
fooGetByIndex(struct foo* foo, int index);
Finché non mi è stato suggerito di utilizzare size_t
, sono sempre stato impostato su int
senza pensarci troppo. Dopo aver sperimentato entrambi non sono abbastanza sicuro di quale sia l'API migliore.
Esistono molte discussioni su size_t
vs int
su un livello più generale, e non è quello che sto chiedendo. Mi interessa il caso più specifico di progettare un'API per una struttura dati che utilizza indici (vale a dire array-like) ma astrae l'accesso diretto all'array attraverso un'API.
Semanticamente size_t
è appropriato per gli indici di array C, che è l'argomento principale per questo in questo caso. Tuttavia, se l'array C è nascosto dietro un'API (che potrebbe non usarne nemmeno uno internamente) tale argomento diminuisce. Inoltre, la possibilità di restituire -1
come valore di errore è molto più semplice quando si utilizza int
, mentre (size_t)-1
è probabilmente più soggetto a errori e confuso per l'utente dell'API, nonostante sia ben definito e persino utilizzato dal C libreria standard nella sua funzione mbstowcs .
Se pertinente, le due API a cui sto lavorando possono essere trovate su CodeReview qui e qui , anche se sto cercando una risposta che si applichi alla progettazione API di strutture di dati basate su indici in generale, non solo a questi due esempi.
In questo caso sta utilizzando o size_t
o int
design API migliore o entrambi sono ugualmente validi (cioè la scelta è soggettiva)?