Initialisierer muss konstant sein
Ich versuche, C zu lernen, aber ich bekomme einen Fehler im folgenden code.
Wenn ich radius in der Lautstärke bekomme ich eine Fehlermeldung: error #2069: Initializer must be constant.
#include <stdio.h>
#define PI (3.14)
/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * radius) );
int main(void){
return 0;
}
Aber wenn ich den radius mit einer tatsächlichen Anzahl, es kompiliert einwandfrei.
#include <stdio.h>
#define PI (3.14)
/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * 10) );
int main(void){
return 0;
}
Warum passiert das und was kann ich tun, um die erste version arbeiten?
- Da Initialisierer muss konstant sein
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C Sie kann nicht initialisiert Globale Variablen mit nicht-Konstanten Ausdrücken.
C99-Standard: Abschnitt 6.7.8:
In deinem Beispiel
volume
ist eine Globale variable, die mit static storage duration undradius
ist nicht konstant. Daher der Fehler.radius
ist eine Globale variable, aber es ist nicht ein konstanter Ausdruck.volume
undradius
befinden sich außerhalb jeder Funktion in der Datei(lieber TU), so dass beide von Ihnen sind global und haben static storage duration. Beide sollten initialisiert werden, mit Konstanten Ausdrücken. Beachten Sie, dass weder von Ihnen, Konstante Ausdrücke.volume
ist die Konstante, weil Ihr Wert nicht ändern, von überall im Programm.Für C und den compiler eine variable konstant ist nur, wenn es ausdrücklich als konstant. Für ex:const int x;
sagt dem compilerx
konstant ist. Es ist genauer wenn.Als standard-Zitat sagt Initialisierung konstant sein sollte Ausdruck, In C(im Gegensatz zu C++)const
Deklarationen erzeugen keine Konstante Ausdrücke. So auch mitconst int radius = 10;
Ihr code nicht kompilieren. In C die Möglichkeit zur Herstellung eines Konstanten Ausdrucks wird durch die Verwendung#define
'sIn C, kann man nur initialisieren Sie eine variable außerhalb einer Funktion mit Konstante Ausdrücke.
int radius
ist nicht ein konstanter Ausdruck.Einen statisches Objekt kann nicht initialisiert werden, mit einer nicht-Konstanten Ausdruck. In deinem Beispiel
volume
ist eine Globale variable und statische Dauer. So kann es nicht initialisiert werden mit einem nicht-Konstanten Ausdruck.Jedoch, wenn
volume
ist eine lokale variable, dann kann es sein, initialisiert mit einer nicht-Konstanten Wert in C99. Also Folgendes ist erlaubt (nicht-Konstanten-Initialisierung) inC99
.Aber der ist nicht gültig in
C90
in dem alle initalizers werden müssen Konstante Ausdrücke.int
vsfloat
Sache. Globale Variablen sind statische Dauer, während lokale Variablen verfügen über eine automatische Dauer. In meiner Antwort,volume
ist eine lokale variable undradius
(statisches Objekt) ist eine Globale variable. Der Typ des Objekts spielt keine Rolle, eher wo & wie Sie deklariert sind, macht den Unterschied.Eine Konstante in dieser Hinsicht ist etwas, ohne eine Speicher-Adresse.
radius
hat eine Speicher-Adresse, so dass es nicht verwendet werden kann für die Initialisierung.Es ist nur C, kein C++, also
radius
muss konstant sein, aber wenn Sie wollen, dass es so eine variable.Definieren
volume
immain()
alsNun, der Fehler kann verschwinden.