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_t
para 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?
CreateFile
recebe umLPTCSTR lpFileName
parâ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).