Atualmente, estou trabalhando em uma biblioteca escrita em C. Muitas funções dessa biblioteca esperam uma string como char*ou const char*em seus argumentos. Comecei com essas funções sempre esperando o comprimento da string como um size_tpara que a terminação nula não fosse necessária. No entanto, ao escrever testes, isso resultou no uso frequente de strlen(), assim:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
Confiar no usuário para transmitir seqüências finalizadas corretamente levaria a um código menos seguro, mas mais conciso e (na minha opinião) legível:
libFunction("I hope there's a null-terminator there!");
Então, qual é a prática sensata aqui? Torne a API mais complicada de usar, mas force o usuário a pensar em sua entrada ou a documentar o requisito para uma sequência terminada em nulo e confiar no chamador?
CreateFilerecebe umLPTCSTR lpFileNameparâmetro como entrada. Nenhum comprimento da sequência é esperado do chamador. De fato, o uso de cadeias terminadas em NUL é tão arraigado que a documentação nem menciona que o nome do arquivo deve ser terminado por NUL (mas é claro que deve ser).