cosa fa registrare const char * const * name; significa e perché questa variabile è al di fuori della funzione? [duplicare]
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 ();
}
Non capisco perché la variabile di registro non è all'interno delle parentesi graffe e cos'è questo (vuoto) davanti a fprintf? Registra anche const char * const * cpp, non ho mai visto niente di simile prima
Risposte
La register
parola chiave è un suggerimento per il compilatore che desideri che quel valore sia mantenuto in un registro dedicato sul processore. Questo può accelerare le letture e le scritture. Con i compilatori moderni, tuttavia, questo tipo di ottimizzazione non solo non è necessaria, ma spesso è controproducente.
Il motivo è tra la dichiarazione della funzione e il blocco è che nella vecchia c (pre C90) non si dichiarava il tipo di parametro accanto al parametro ma tra la dichiarazione della funzione e il blocco.
Per esempio:
int main(argc, argv)
char ** argv;
{
...
}
Si noti che non ho fatto nulla argc
perché se non si definisce esplicitamente un tipo, il valore predefinito è int.
Lo vedrai più spesso di quanto pensi. Mi sono imbattuto in questo un sacco quando ho lavorato su FFMPEG.
La cosa cast (void) impedisce avvisi / errori dei parametri inutilizzati. Mi sono imbattuto in questo quando lavoro su PortAudio con una funzione di callback di basso livello.
Il motivo per cui "non l'hai mai visto prima" è perché utilizza la sintassi della versione C originale, storica, di K&R . Deve essere un vero, vecchio codice C che stai guardando. Ho solo guardato in alto e ANSI C (C90) è uscito nel 1990, quindi questo codice deve avere almeno 30 anni, o giù di lì, vecchio.
Suppongo che questo sia qualcosa che deve essere conosciuto se si ha bisogno di trattare con il codice C storico, ma per il resto puoi semplicemente dimenticarlo.
Il (void)
cast significa la stessa cosa che significa oggi.