Erro ao verificar uma função que retorna um int

Se eu tiver uma função que retorne algum tipo de ponteiro, verifico se há erros configurando o retorno como NULL por erro.

char *foo(void) {
  //If stuff doesn't go okay
  return NULL;
}

char *bar = foo();
if(!bar) return 1;

Isso funciona muito bem porque eu sei que, nesses casos, nunca tencionarei retornar NULL.

No entanto, algumas vezes terei funções que retornam números inteiros (nesse caso, estou lendo ints de um arquivo de configuração). No entanto, o problema é que agora não há como verificar se há erros no valor retornado, pois qualquer valor (incluindo 0) pode ser genuíno.

Algumas soluções alternativas:

Incluir um parâmetro de código de erro na funçãoRetorne um código de erro e inclua um ponteiro int como parâmetro

O problema de ambos é que tenho um conjunto de funções que fazem a mesma coisa, mas para tipos diferentes, e quero manter uma interface regular para que possam ser usadas da mesma maneira.

Existe outra solução que não envolve a alteração da interface para a função? Qual é a maneira mais comum de lidar com esta situação?

SOLUÇÃO ESCOLHIDA

Obrigado por todos os seus pensamentos e respostas sobre isso.

No final, decidi que, se uma função se destina a retornar alguns dados, um erro só pode ser retornado através de um parâmetro de erro. Caso contrário, o erro será retornado diretamente.

Eu escolhi essa raiz porque geralmente descobri que, ao retornar formas mais complexas de dados, o número de erros em potencial quase sempre era maior que 1. Isso significava que o uso de NULL como única fonte de dados de erros era impraticável, pois significava que não havia maneira de determinar qual foi realmente o erro. Com as funções retornando dados como int, também se tornou impossível distinguir vários códigos de erro diferentes de dados válidos.

O mesmo não é verdade, é claro, para funções que não estão realmente retornando dados; nesse caso, sou livre para usar o valor de retorno como um código de erro.

Também gosto do fato de que o padrão acima faz uma distinção clara entre funções que retornam dados e funções que não retornam.

questionAnswers(7)

yourAnswerToTheQuestion