Das Initialisierungselement ist in C nicht konstant [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
huckepack

Ich komme von javascript/php/python und wahrscheinlich fehlt mir etwas, hier ist der Code:

const int a = 50;
const int c = 100;
const int d = 100;
int endX = c + a;
int endY = d;
int startX, startY, b;

Ich bekomme

ex1.4.c:6: Fehler: Initialisierungselement ist nicht konstant
ex1.4.c:7: Fehler: Initialisierungselement ist nicht konstant

Hat jemand eine Erklärung?

  • Schauen Sie sich das Feld rechts neben dieser Frage an, die schon oft gestellt wurde. Bitte durchsuchen Sie diese Seite, bevor Sie fragen.

    – Jens Gustedt

    5. Oktober 2012 um 17:01 Uhr

  • Ich kann Ihren Code gut kompilieren. Welchen Compiler/System verwendest du?

    – keiner

    5. Oktober 2012 um 17:04 Uhr


  • @gokcehan: Verwenden Sie zufällig einen C++-Compiler?

    – Steve Jessop

    5. Oktober 2012 um 17:10 Uhr


  • @SteveJessop nein, habe sie nur alle eingepackt main und kompiliert mit gcc main.c.

    – keiner

    5. Oktober 2012 um 17:15 Uhr

  • @gokcehan: ah, der Code des Fragestellers ist nicht drin maines befindet sich im Dateibereich.

    – Steve Jessop

    5. Oktober 2012 um 17:16 Uhr


Benutzer-Avatar
Maksim Skurydzin

Leider in C const Variablen sind nicht wirklich konstant.

Nachfolgend finden Sie die Auszüge aus dem c99-Standard.

6.7.8 Initialisierung

  1. Alle Ausdrücke in einem Initialisierer für ein Objekt, das hat statische Speicherdauer muss konstante Ausdrücke oder Zeichenfolgenliterale.

Die Konstanten sind wie folgt definiert:

6.4.4 Konstanten

Syntax

Konstante:

integer-constant       (e.g. 4, 42L)
floating-constant      (e.g. 0.345, .7)
enumeration-constant   (stuff in enums)
character-constant     (e.g. 'c', '\0')

Der Standard definiert konstante Ausdrücke wie folgt:

6.6 Konstante Ausdrücke

(7) Für konstante Ausdrücke in Initialisierern ist mehr Spielraum erlaubt. Ein solcher konstanter Ausdruck muss einer der folgenden sein oder zu einem der folgenden Werte ausgewertet werden:

— ein arithmetischer konstanter Ausdruck,

— eine Nullzeigerkonstante,

— eine Adresskonstante, oder

— eine Adresskonstante für einen Objekttyp plus oder minus einen ganzzahligen Konstantenausdruck.

(8) Ein arithmetischer konstanter Ausdruck muss einen arithmetischen Typ haben und soll
nur haben Operanden, die ganzzahlige Konstanten, Gleitkommakonstanten, Aufzählungskonstanten, Zeichenkonstanten und sizeof-Ausdrücke sind. Cast-Operatoren in einem arithmetischen konstanten Ausdruck konvertieren nur arithmetische Typen in arithmetische Typen, außer als Teil eines Operanden für einen sizeof-Operator, dessen Ergebnis eine ganzzahlige Konstante ist.

Daher, c und a sind keine konstanten Ausdrücke und können in Ihrem Fall nicht als Initialisierer verwendet werden.

const Ausdrücke müssen daher in C anders als in C++ eine Kompilierzeitkonstante sein c+a kann nicht als Konstante verwendet werden. Der übliche Weg, dieses Problem in C zu behandeln, ist die Verwendung von Präprozessor stattdessen:

#define A 50
#define C 100
#define D 100
int endX = C + A;
int endY = D;
int startX, startY, b;

  • wenn c und a sind dann Kompilierzeitkonstanten c+a auch ist (und alles, dem dieser Ausdruck zugewiesen ist). Es ist nicht so, dass C++ keine const-Ausdrücke als Konstanten zur Kompilierzeit benötigt; C++ ist intelligent genug, um das zu erkennen const int + const int ist eine Kompilierzeitkonstante, während C nicht so schlau ist.

    – weberc2

    27. Juli 2014 um 14:14 Uhr

Wenn Sie endX als globale Variable deklarieren, ist der Fehler sinnvoll.

Der Grund dafür ist, dass globale Variablen zur Kompilierungszeit initialisiert werden und Sie versuchen, endX als eine Operation zu initialisieren, die zur Ausführungszeit ausgeführt werden muss.

  • -1. Diese Antwort ist falsch. Nichts hindert den Compiler daran, endX vor der Ausführungszeit zu berechnen. Tatsächlich wird g++ dies gerne kompilieren. Es ist nur GCC, das übermäßig verschroben ist, was es akzeptiert.

    – weberc2

    23. Juli 2014 um 2:56 Uhr

  • @weberc2 ist richtig. Ich habe dies mit dem Clang-Compiler versucht und es wurde erfolgreich kompiliert und ausgeführt.

    – ZeZNiQ

    23. Januar 2020 um 0:53 Uhr


Benutzer-Avatar
Markus Stevens

Ja, Sie können nichts mit einer Variablen initialisieren. Der Compiler führt die Initialisierung durch und kennt zur Kompilierzeit den Wert von nicht c+a;

Das int x = 1; Typinitialisierung ist in Ordnung, der Compiler setzt einfach a 1 unter der Adresse von x im Objektcode.

Um etwas zu initialisieren c+aSie möchten dies zur Laufzeit im Startcode in tun c oder Konstrukteur in C++.

In C-Programmiersprachen müssen Objekte mit statischer Speicherdauer mit konstanten Ausdrücken (oder Aggregaten, die konstante Ausdrücke enthalten) initialisiert werden. Wenn endX hat eine statische Speicherdauer, seinen Initialisierer (c+a) ist kein konstanter Ausdruck (dh der Ausdruck kann während der Übersetzungsphase nicht ausgewertet werden).

1245240cookie-checkDas Initialisierungselement ist in C nicht konstant [duplicate]

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

Privacy policy