qué registra const char * const * name; media y por qué esta variable está fuera de la función? [duplicar]

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 ();
}

No entiendo por qué la variable de registro no está dentro de las llaves y qué es esto (vacío) delante de fprintf? También registre const char * const * cpp, nunca había visto nada como esto antes

Respuestas

6 JacobBlomquist Jan 01 2021 at 04:52

La registerpalabra clave es una sugerencia para el compilador de que le gustaría que ese valor se mantuviera en un registro dedicado en el procesador. Esto puede acelerar la lectura y la escritura. Sin embargo, con los compiladores modernos, este tipo de optimización no solo es innecesaria, sino que a menudo es contraproducente.

La razón por la que está entre la declaración de la función y el bloque es que en el antiguo c (anterior a C90) no se declararía el tipo de parámetro junto al parámetro, sino entre la declaración de la función y el bloque.

Por ejemplo:

int main(argc, argv)
char ** argv;
{
 ...
}

Tenga en cuenta que no hice nada argcporque si no define explícitamente un tipo, el valor predeterminado es int.

Verás esto con más frecuencia de lo que piensas. Me encontré con esto un montón cuando trabajé en FFMPEG.

El elemento de conversión (nulo) evita advertencias / errores de parámetros no utilizados. Me encontré con esto cuando trabajaba en PortAudio con una función de devolución de llamada de bajo nivel.

13 SamVarshavchik Jan 01 2021 at 04:26

La razón de que haya "nunca había visto esto antes" se debe a que esto está utilizando la sintaxis del original, K & R versión histórica, C . Debe ser un código C antiguo y real que está viendo. Acabo de mirar hacia arriba y ANSI C (C90) salió en 1990, por lo que este código debe tener al menos 30 años, más o menos, de antigüedad.

Supongo que esto es algo que debe conocerse si uno necesita lidiar con el código C histórico, pero de lo contrario, simplemente puede olvidarlo.

El (void)elenco significa lo mismo que significa hoy.