C: Verhalten des Schlüsselworts 'const'

7

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?

    
Andrew Turner 13.09.2009, 10:21
quelle

7 Antworten

9

Der Java-Compiler verfügt über eine kleine Flusslogik, mit der Sie final -Variablen nach ihrer Deklaration initialisieren können. Dies ist legales Java:

%Vor%

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.

%Vor%

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%     
Pete Kirkham 13.09.2009, 10:53
quelle
3

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):

%Vor%

Dasselbe gilt für const-Zeiger (beachten Sie hier: const int * ist kein Const-Zeiger, sondern ein Zeiger auf const):

%Vor%     
Cat Plus Plus 13.09.2009 10:28
quelle
3

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%     
Steve Jessop 13.09.2009 10:46
quelle
2

Sie können die const after-Deklaration im Funktionskörper nicht initialisieren, aber Sie können nur einen Block nach Ihren Assertionen öffnen:

%Vor%     
Pavel Shved 13.09.2009 10:42
quelle
2

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:

  • Zeiger in Funktionsargumenten (oder lokalen Variablenzeigern basierend auf Argumenten), bei denen die Funktion einen Vertrag honoriert, die angezeigten Daten nicht zu ändern. Das const-Schlüsselwort stellt sicher, dass die Funktionsimplementierung die Anforderung erfüllt, nicht zu ändern (es erfordert ein besonderes Aufwand-Casting, um const loszuwerden) und ermöglicht, dass sich diese Anforderung über mehrere Funktionsaufrufe ausbreiten kann.
  • Zum Deklarieren von Kompilierungszeit-Konstantentabellen (Nachschlagetabellen, vordefinierten permanenten Objekten usw.), die in einem schreibgeschützten Abschnitt der Binärdatei gespeichert werden sollen, damit sie zur Laufzeit keine zusätzlichen physischen Ressourcen verwenden.

Ich deklariere manchmal lokale Variablen const, wenn ich denke, dass es dem Leser beim Verständnis einer Funktion hilft, aber das ist ziemlich selten.

    
R.. 08.07.2010 07:29
quelle
1

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 haben     
Pascal Cuoq 13.09.2009 10:32
quelle
0

Wenn Sie const auf der LHS wegwerfen möchten, wie wäre es damit?

%Vor%     
wardw 09.06.2011 21:36
quelle