Attualmente sto lavorando a una libreria scritta in C. Molte funzioni di questa libreria prevedono una stringa come char*
o const char*
nei loro argomenti. Ho iniziato con quelle funzioni aspettandomi sempre la lunghezza della stringa in size_t
modo che non fosse richiesta la terminazione nulla. Tuttavia, quando si scrivono i test, ciò ha comportato un uso frequente di strlen()
, in questo modo:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
Fidarsi che l'utente passi stringhe correttamente terminate porterebbe a un codice meno sicuro, ma più conciso e (secondo me) leggibile:
libFunction("I hope there's a null-terminator there!");
Allora, qual è la pratica sensata qui? Rendere l'API più complicata da usare, ma costringere l'utente a pensare al proprio input o documentare il requisito per una stringa con terminazione null e fidarsi del chiamante?
CreateFile
accetta unLPTCSTR lpFileName
parametro come input. Non è prevista alcuna lunghezza della stringa dal chiamante. In effetti, l'uso di stringhe con terminazione NUL è così radicato che la documentazione non menziona nemmeno che il nome del file deve essere terminato con NUL (ma ovviamente deve esserlo).