Warum muss die const-Variable nicht in C initialisiert werden?

Lesezeit: 4 Minuten

Benutzeravatar von Destructor
Destruktor

const Variablen in C++ müssen initialisiert werden bedeutet uninitialized const variable ist nicht möglich und es ist ein Compilerfehler. Aber warum ist es nicht auch in der C-Sprache so? Betrachten Sie das folgende Programm, das feines C kompiliert:

#include <stdio.h>
int main()
{
    const int a;
}

Was ist der Grund zu erlauben uninitialized const? Wäre es nicht schön, wenn C auch der gleichen Regel folgt wie C++? Liegt es an Leistungsbedenken, dass die lokale konstante Variable jedes Mal initialisiert werden muss, wenn eine Funktion aufgerufen wird und die Initialisierung einige Zeit in Anspruch nimmt?

  • Anmerkung des Moderators: Bitte verwenden Sie Kommentare, um eine Klärung/Diskussion der gestellten Frage zu erbitten. Danke schön.

    – Jon Clements

    23. Juni 2015 um 14:23 Uhr

AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

Der Unterschied rührt wahrscheinlich unter anderem von einer deutlich lockereren Herangehensweise an die Initialisierung in der Sprache C her allgemeinnicht nur bzgl const Objekte. Dieser Code ist beispielsweise in C++ illegal

goto over;
int a = 5;
over:;

weil es in den Geltungsbereich von springt a unter Umgehung seiner Initialisierung. Inzwischen ist dieser Code in C völlig legal, mit Variablen a mit unbestimmtem Wert bei over:.

Die gleiche Logik gilt für Ihre const int a Erklärung. C-Sprache glaubt einfach, dass ein nicht initialisiertes Objekt keine große Sache ist, selbst in Situationen, in denen es später nicht mehr möglich ist, es auf einen bestimmten Wert zu setzen.

Der Hauptgrund für strengere Initialisierungsanforderungen in C++ ist die Einführung nicht-trivialer Initialisierungen (Konstruktoren) in die Sprache, dh Initialisierungen, die nicht sinnvoll umgangen werden können. Skalare Objekte und ihre Initialisierung in C++ sind nur ein kleiner Teil eines viel umfassenderen Konzepts.

Wäre es nicht schön, wenn C auch der gleichen Regel folgt wie C++?

Ich sehe es nicht. C und C++ sind wesentlich unterschiedliche Sprachen. Und sie behandeln const auch ganz anders.

chux – Stellt Monicas Benutzeravatar wieder her
Chux – Wiedereinsetzung von Monica

Warum muss die const-Variable nicht in C initialisiert werden?

Geschichte.

const wurde von Anfang an in C++ spezifiziert und die Verwendung erfüllte die Ziele dieser Sprache. const wurde später in C mit einer verwandten, aber anderen Bedeutung spezifiziert, um bestehende Kompatibilitätsprobleme mit C-Code zu minimieren.

Da C ohne begann constseine spätere Aufnahme ähnelt eher einer read-only Modifikator als a constant einer. Dadurch konnten bestehende Compiler wesentlich behandelt werden const als nichts zum Schreiben an a const ist undefiniertes Verhalten. Neuere Compiler/Code könnten dies ausnutzen const bietet.

const int a;
a = 5;  // problem in C as code attempts to write `a`

// Really should be `const char *fred`, but allowed for backwards compatibility.
char *fred = "sally";  

C++ hat einen stärkeren Ansatz gewählt und verlangt die Initialisierung.

Siehe auch const in C vs const in C++

Weil C dem Programmierer absolut vertraut und ihm erlaubt, viele Dinge zu tun, einschließlich Dummheiten: int *x = NULL; x[4] = 12; wird von vielen Compilern fehlerfrei und sogar ohne Warnungen kompiliert.

Etwas präziser, const ist nur ein Versprechen des Programmierers, dass die Variable nicht geändert werden sollte, und dass der Compiler sie als konstant betrachten könnte, wenn dies bei Optimierungen helfen kann. Der Compiler wird jedoch niemals Laufzeitregeln erzwingen, um zu verbieten, einen konstanten Wert zu ändern:

const a = 1;
int *ix = (int *) &a;
*ix = 2;
printf("a=%d\n", a); /* UB : could print 1 or 2 */

wird ohne Warnung kompiliert. Aber es wird ein undefiniertes Verhalten hervorrufen, weil Sie ein als const deklariertes Objekt geändert haben.

Ich glaube, dass das Initialisieren von konstanten Variablen einfach deshalb nicht erlaubt ist, weil die aktuelle C-Spezifikation dies nicht verbietet! In früheren Versionen war die Initialisierung immer optional. Möglicherweise könnten zukünftige Versionen die Initialisierung für automatische Variablen erzwingen

Auf jeden Fall wird eine globale oder statische konstante Variable tatsächlich automatisch initialisiert (gemäß der C-Sprachspezifikation 6.7.9 10): Wenn ein Objekt mit statischer oder Thread-Speicherdauer nicht explizit initialisiert wird, dann: … wenn es einen arithmetischen Typ hat, wird es auf (positiv oder vorzeichenlos) Null initialisiert; …

Damit static const a; ist vollkommen gültig, wie es ist const a wenn a ist global und in diesem Fall a=0.

  • Es ist auch möglich, dass einige Build-Systeme Mittel definieren, mit denen Dinge, die nach dem Start eines Programms konstant sind, zwischen Kompilierung und Ausführung geändert werden können (z. B. durch ein Dienstprogramm, das die Link-Map liest und die ausführbare Datei patcht). Der C-Standard stellt keine Mittel bereit, durch die solche Dinge passieren könnten, aber es gibt keinen Grund dafür, ein Konstrukt zu verbieten, das durch solche Mittel nützlich gemacht werden könnte.

    – Superkatze

    11. August 2016 um 23:14 Uhr


Ich glaube, der Grund liegt in der Konvention.

In C ist praktisch keine Art von Objekt jemals erforderlich initialisiert werden, und war es noch nie erforderlich initialisiert werden.

const Objekte sind nur eine weitere Art von Objekten mit einer besonderen Eigenschaft, warum sollte man bei ihnen eine Ausnahme machen?

1437190cookie-checkWarum muss die const-Variable nicht in C initialisiert werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy