É uma prática comum salvar o argumento 0th passado para um programa em C main
e usá-lo como parâmetro para perror
- para programas simples:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *foo = malloc(9999999999L);
if (foo == 0)
perror(argv[0]);
return 0;
}
chame esse programa de "foo" e executá-lo ilustra o ponto:
> ./foo
./foo: Cannot allocate memory
Programas complicados podem adicionar ao texto (ou usar apenas o nome do arquivo sem o caminho), mas manter o nome do programa permite que você descubra de onde vem um programa com comportamento inadequado.
Não há um esquema universalmente aceito para mensagens de erro, mas alguns programas amplamente usados (como o gcc) adicionam uma categoria de mensagem como "Erro" ou "Aviso". Aqui está um exemplo de um dos meus logs de compilação:
compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
res = (TypeArgument *)argp;
^
Neste exemplo, o gcc separa campos com dois-pontos e adiciona uma categoria "aviso" após o nome do arquivo, número da linha, número da coluna - e antes da mensagem real. Mas há várias variações, o que é complicado para programas (como vi-like-emacs ) para analisar a informação.
Para compiladores, usar uma categoria na mensagem simplifica a detecção de erros fatais (que podem não ser imediatamente fatais ) e avisos. Se o seu programa sair por um erro, isso não adiciona muito para dizer que alguns são realmente avisos e alguns são erros. Mas quando se comporta de maneira diferente (ou continua a trabalhar mais ou menos), a categoria ajuda a diagnosticar o problema encontrado.