cosa fa registrare const char * const * name; significa e perché questa variabile è al di fuori della funzione? [duplicare]

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

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

6 JacobBlomquist Jan 01 2021 at 04:52

La registerparola 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 argcperché 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.

13 SamVarshavchik Jan 01 2021 at 04:26

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.