Mir wurde gesagt, dass, wenn ich in ANSI-C schreibe, um in der Reihenfolge zu deklarieren, dass die Variablen verwendet werden, behaupten, dass Zeiger nicht null sind und Indizes innerhalb von Grenzen sind, und kurz vor der Verwendung von zu initialisieren die Variable.
Wenn ich ein const deklariere, kann ich es nach einem Block von Behauptungen und Code initialisieren? In Java müssen finale Initialisierungen bei der Deklaration erfolgen, aber ist es durch ANSI-C-Implementierungen konsistent, dass ich ein const einmal initialisieren kann, aber nicht unbedingt zum Zeitpunkt der Deklaration?
Der Java-Compiler verfügt über eine kleine Flusslogik, mit der Sie final
-Variablen nach ihrer Deklaration initialisieren können. Dies ist legales Java:
Java erkennt, ob Zweige den Endwert undefiniert lassen. Es wird die Bedingungen nicht analysieren, also ist dies kein legales Java, obwohl es logisch ähnlich ist:
%Vor% In ANSI C89 müssen const
Variablen (außer extern
) in der Anweisung initialisiert werden, in der sie deklariert sind.
Der Modifikator " extern
" in einer Deklaration teilt dem Compiler mit, dass die Variable in einer anderen Kompilierungseinheit (oder anderswo in dieser Kompilierungseinheit) initialisiert wird.
In ANSI C99 können Sie Deklarationen und Code mischen, sodass Sie eine const
-Variable nach einem Block von Assertions und Code deklarieren und initialisieren können. Portabilität von 1999 ANSI C bleibt ein Problem.
Eine Umgehung für C89 besteht darin, zu beachten, dass die Regeln für Deklarationen, die dem Code vorangehen, im Blockbereich und nicht im Funktionsumfang arbeiten, also können Sie dies tun:
%Vor% const
Variablen sind schreibgeschützt und müssen dort initialisiert werden, wo sie definiert sind.
Dieser Code erzeugt error: assignment of read-only variable 'foo'
(gcc4):
Dasselbe gilt für const-Zeiger (beachten Sie hier: const int *
ist kein Const-Zeiger, sondern ein Zeiger auf const):
Beachten Sie, dass Sie selbst in C89 die Definition oft näher an den Punkt der ersten Verwendung verschieben können, indem Sie nur für den zusätzlichen Bereich einen leeren Block einfügen. Vorher:
%Vor%Nachher:
%Vor%Mit C99 können Sie natürlich andere Variablen als am Anfang eines Blocks definieren:
%Vor%Sie können die const after-Deklaration im Funktionskörper nicht initialisieren, aber Sie können nur einen Block nach Ihren Assertionen öffnen:
%Vor%Kurz vor dem Blockbereich und den C99-Deklarationsmethoden, die andere gezeigt haben, ist die Antwort nein; Sie können die Initialisierung einer const-Variablen nicht verzögern. Wie auch immer, const ist nicht sehr nützlich für lokale Variablen. Die Hauptzeit, in der ich das Schlüsselwort const in C verwende, sind:
Ich deklariere manchmal lokale Variablen const, wenn ich denke, dass es dem Leser beim Verständnis einer Funktion hilft, aber das ist ziemlich selten.
Wenn Sie davon sprechen, eine Definition aufzuteilen
%Vor%in zwei Teile:
%Vor%Ich fürchte, das ist in C nicht möglich.
Wenn ich Sie wäre, würde ich versuchen, sicherzustellen, dass ich die Absicht der Codierungsregeln verstehe, die Sie beschreiben. Ich bezweifle, dass vernünftige Codierungsregeln das Initialisieren von Variablen (sogar nicht konstante Variablen) verhindern würden.
Als Reaktion auf verschiedene Kommentare:
%Vor%ist KEINE Deklaration einer const-Variablen. Es ist eine Deklaration einer nichtkonstanten Zeigervariablen auf ein const int.
Sie können
deklarieren %Vor%Sie können x jedoch immer noch nicht initialisieren, nachdem Sie Code, Assertion Checks, ...
ausgeführt habenTags und Links c const keyword language-implementation