Obecnie pracuję nad biblioteką napisaną w C. Wiele funkcji tej biblioteki oczekuje łańcucha jako char*
lub const char*
w swoich argumentach. Zacząłem od tych funkcji, które zawsze oczekiwały długości łańcucha, size_t
aby nie było wymagane zakończenie zerowe. Jednak podczas pisania testów spowodowało to częste korzystanie z strlen()
:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
Ufanie użytkownikowi, że przekaże poprawnie zakończone ciągi, prowadziłoby do mniej bezpiecznego, ale bardziej zwięzłego i (moim zdaniem) czytelnego kodu:
libFunction("I hope there's a null-terminator there!");
Jaka jest tutaj rozsądna praktyka? Czy interfejs API jest bardziej skomplikowany w użyciu, ale zmusić użytkownika do przemyślenia jego danych wejściowych, lub udokumentować wymaganie łańcucha zakończonego znakiem zerowym i zaufać programowi wywołującemu?
CreateFile
przyjmowanieLPTCSTR lpFileName
parametru jako danych wejściowych. Od osoby dzwoniącej nie oczekuje się długości ciągu. W rzeczywistości użycie ciągów zakończonych przez NUL jest tak zakorzenione, że dokumentacja nawet nie wspomina, że nazwa pliku musi być zakończona przez NUL (ale oczywiście tak musi być).