Was registriert das Register const char * const * name? Mittelwert und warum ist diese Variable außerhalb der Funktion? [Duplikat]
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 ();
}
Ich verstehe nicht, warum sich die Registervariable nicht in den geschweiften Klammern befindet und was ist diese (Leere) vor fprintf? Registrieren Sie auch const char * const * cpp, so etwas habe ich noch nie gesehen
Antworten
Das registerSchlüsselwort ist ein Hinweis für den Compiler, dass dieser Wert in einem dedizierten Register auf dem Prozessor gespeichert werden soll. Dies kann das Lesen und Schreiben beschleunigen. Bei modernen Compilern ist diese Art der Optimierung jedoch nicht nur unnötig, sondern oft kontraproduktiv.
Der Grund zwischen der Funktionsdeklaration und dem Block liegt darin, dass Sie im alten c (vor C90) den Parametertyp nicht neben dem Parameter deklarieren würden, sondern zwischen der Deklaration der Funktion und dem Block.
Beispielsweise:
int main(argc, argv)
char ** argv;
{
...
}
Beachten Sie, dass ich nichts getan habe, argcdenn wenn Sie einen Typ nicht explizit definieren, wird standardmäßig int verwendet.
Sie werden das öfter sehen als Sie denken. Ich bin darauf gestoßen, als ich an FFMPEG gearbeitet habe.
Das (nichtige) Cast-Ding verhindert nicht verwendete Parameterwarnungen / -fehler. Ich bin darauf gestoßen, als ich an PortAudio mit einer Low-Level-Rückruffunktion gearbeitet habe.
Der Grund, warum Sie "das noch nie gesehen haben", ist, dass hierfür die Syntax der ursprünglichen, historischen K & R C-Version verwendet wird . Das muss ein echter, alter C-Code sein, den Sie sich ansehen. Ich habe gerade nachgeschlagen und ANSI C (C90) kam 1990 heraus, daher muss dieser Code mindestens 30 Jahre alt sein.
Ich nehme an, das muss bekannt sein, wenn man sich mit historischem C-Code befassen muss, aber sonst kann man es einfach vergessen.
Die (void)Besetzung bedeutet dasselbe wie heute.