o que registra const char * const * name; significa e por que essa variável está fora da função? [duplicado]
void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();
}
Não entendo por que a variável de registro não está entre chaves e o que é isso (vazio) na frente de fprintf? Registre também const char * const * cpp, nunca vi nada assim antes
Respostas
A register
palavra-chave é uma dica para o compilador de que você gostaria que o valor fosse mantido em um registro dedicado no processador. Isso pode acelerar leituras e gravações. Com compiladores modernos, no entanto, esse tipo de otimização não é apenas desnecessário, mas muitas vezes contraproducente.
A razão de estar entre a declaração da função e o bloco é que no antigo c (pré C90) você não declararia o tipo de parâmetro próximo ao parâmetro, mas entre a declaração da função e o bloco.
Por exemplo:
int main(argc, argv)
char ** argv;
{
...
}
Observe que não fiz nada argc
porque, se você não definir explicitamente um tipo, o padrão é int.
Você verá isso com mais frequência do que você pensa. Eu me deparei com isso várias vezes quando trabalhei no FFMPEG.
O elenco (void) evita avisos / erros de parâmetros não utilizados. Eu me deparei com isso ao trabalhar no PortAudio com uma função de retorno de chamada de baixo nível.
A razão que você "nunca vi isso antes" é porque isso é usando a sintaxe do original, , K & R versão histórica C . Deve ser algum código C antigo e real que você está vendo. Acabei de pesquisar e ANSI C (C90) foi lançado em 1990, então esse código deve ter pelo menos 30 anos ou mais.
Suponho que isso seja algo que precisa ser conhecido se for necessário lidar com o código C histórico, mas caso contrário, você pode simplesmente esquecê-lo.
O (void)
elenco significa a mesma coisa que significa hoje.