static int a = 6;
static int b = 3;
static int Hello[a][b] =
{
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3}
};
aber wenn ich es kompiliere, sagt es Fehler:
variabel modifiziertes ‘Hallo’ im Dateibereich
Wie konnte das passieren? und wie könnte ich es beheben?
Mögliches Duplikat von Variabel modifiziertes Array im Dateibereich
– Eintopf
6. Oktober 2016 um 19:01 Uhr
Sie können kein statisches Array haben, dessen Größe als Variable angegeben wird
Deshalb sollten Konstanten sein #defined:
#define a 6
Auf diese Weise wird der Präprozessor ersetzt a mit 6was es zu einer gültigen Erklärung macht.
ist a und b definiert als int a = 6; int b = 3 statt static int a = 6 funktioniert?
– Benutzer707549
30. November 2012 um 13:16 Uhr
Nein, dies wird immer noch eine Variable sein. Verwenden #define. In C++ gibt es const das würde erlauben const int a = 6; zu arbeiten, aber sogar const reicht in C nicht aus.
– zch
30. November 2012 um 13:19 Uhr
Eine Alternative zu Makros ist die Verwendung anonymer Aufzählungen, die echte Ganzzahlkonstanten sind enum { a = 6, b = 3, };
– tstanisl
22. Februar 2021 um 11:20 Uhr
Omkant
Einfache Antwort variable modified array at file scope is not possible.
Ausführlich:
machen es kompilieren zeit integral constant expressionda die Arraylänge zur Kompilierzeit angegeben werden muss.
so was :
#define a 6
#define b 3
Oder folgen Sie dem c99-Standard. und wie für gcc kompilieren.
gcc -Wall -std=c99 test.c -o test.out
Das Problem hier ist, dass ein Array mit variabler Länge, das die Länge bereitstellt, möglicherweise nicht initialisiert wird, sodass Sie diesen Fehler erhalten.
einfach
static int a =6;
static int b =3;
void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}
Verwenden Sie nun die for-Schleife oder eine beliebige Schleife, um das Array zu füllen.
Für weitere Informationen nur eine DEMO:
#include <stdio.h>
static int a = 6;
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it's in function
//scope but still error
return 0;
}
[email protected]:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
^
1 error generated.
Wenn Sie statisch entfernen und eine Initialisierung bereitstellen, wird wie oben ein Fehler generiert.
Aber wenn Sie sowohl statisch als auch initialisieren, wird der Fehler immer noch auftreten.
Aber wenn Sie die Initialisierung entfernen und behalten static Der folgende Fehler wird kommen.
error: variable length array declaration not allowed at file scope
static int Hello[a];
^ ~
1 error generated.
Daher ist die Deklaration von Arrays mit variabler Länge im Dateibereich nicht zulässig. Machen Sie sie also zum Funktions- oder Blockbereich innerhalb einer beliebigen Funktion (aber denken Sie daran, dass der Funktionsbereich die Initialisierung entfernen muss).
HINWEIS: Da es ist C getaggt so machen a und b wie const hilft dir aber nicht weiter C++const wird gut funktionieren.
C99 unterstützt auch keine VLAs im Dateibereich. es muss im Funktionsbereich oder kleiner sein. Er „kann“ verwenden konst Indexdeklarationen, einschließlich static const int a = 10; beispielsweise im Dateibereich.
– WhozCraig
30. November 2012 um 13:22 Uhr
Es ist eine Stack-Sache. Wenn sie sogar von Ihrem C99-Compiler unterstützt werden, ist dies nicht vorgeschrieben; die Norm definiert wie Sie benehmen sich wenn Ihr C99 tut unterstütze sie. Die Implementierungen verwenden Stapelmathematik, um sie zu implementieren. Sie können dies nicht auf der Kompilierungsebene von globalen (oder Datei-)Datensegmenten tun.
– WhozCraig
30. November 2012 um 13:33 Uhr
@WhozCraig: Aber wenn ich definiere a in main In diesem Fall funktioniert es auch nicht, mit zu kompilieren -std=c99 . jetzt a is on stack also was ist jetzt das problem , ich habe es mit versucht gcc und clang
– Omkant
30. November 2012 um 13:36 Uhr
@WhozCraig: Ich habe irgendwo auf SO selbst gelesen, also die Antwort gepostet, aber ich stehe jetzt selbst vor dieser Frage -std=c99 und nicht kompilieren, irgendein Hinweis? werde meine Antwort auch bearbeiten
– Omkant
30. November 2012 um 13:39 Uhr
@WhozCraig: Ich habe es verstanden, du liegst falsch mit Stack-Ding, es könnte global sein
– Omkant
30. November 2012 um 13:46 Uhr
Eisbär2015
Bei Verwendung von CLANG/LLVM funktioniert Folgendes:
static const int a = 6;
static const int b = 3;
static int Hello[a][b] =
{
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3},
{ 1,2,3}
};
(Um es in der generierten Assembly zu sehen, muss man Hello verwenden, damit es nicht optimiert wird.)
Dies erzeugt jedoch einen Fehler, wenn der C99-Modus ausgewählt ist (-std=c99), es wird nur eine Warnung (Wgnu-folding-constant) generiert, wenn -pedantic ausgewählt ist.
GCC scheint dies nicht zuzulassen (const wird als schreibgeschützt interpretiert)
Siehe Erklärung in diesem Thread:
“Initializer-Element ist nicht konstant” Fehler ohne Grund in Linux GCC beim Kompilieren von C
Das Schlüsselwort ‘const’ in C bedeutet nicht wirklich ‘Konstante’. Dies führt einige Benutzer in die Irre.
– Geringer Strom
12. März 2019 um 4:07 Uhr
@Lowpower Ich stimme zu – dies ist ein Detail der Implementierung. Darüber hinaus scheint die tatsächliche Implementierung von Kosten zu variieren, in C++ sind zumindest einige Konstanten keine schreibgeschützten Variablen mehr (was bedeutet, dass es kein Symbol in der Symboltabelle gibt, das auf ein Nur-Lese-Speichersegment zeigt), sondern echte Konstanten, die zur Kompilierzeit aufgelöst werden.
– Eisbär2015
2. August 2019 um 23:44 Uhr
Ja, das nervt:
const int len = 10;
int stuff[len];
Gibt den Fehler. Ich versuche, von #define x wegzukommen, weil const int eine bessere Art ist, eine Konstante zu deklarieren, aber dann gibt es diese Fälle, in denen const int keine echte Konstante ist, obwohl der Compiler genau weiß, dass sie es ist.
14122500cookie-checkvariabel modifiziertes Array im Dateibereich in Cyes
Mögliches Duplikat von Variabel modifiziertes Array im Dateibereich
– Eintopf
6. Oktober 2016 um 19:01 Uhr