o que registra const char * const * name; significa e por que essa variável está fora da função? [duplicado]

Jan 01 2021
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

6 JacobBlomquist Jan 01 2021 at 04:52

A registerpalavra-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 argcporque, 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.

13 SamVarshavchik Jan 01 2021 at 04:26

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.