Variabel gemodificeerde array bij bestandscope in C

Ik heb wat code als volgt:

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}
};

Maar wanneer ik het compileer, zegt er fouten:

Variabel gewijzigd ‘Hallo’ bij bestandscope

Hoe kan dit gebeuren? en hoe kan ik het repareren?


Antwoord 1, Autoriteit 100%

U kunt geen statische array hebben welke maat wordt gegeven als een variabele

Daarom zouden constanten moeten zijn #defineD:

#define a 6

Op deze manier wordt preprocessor vervangen door amet 6, waardoor het geldige verklaring is.


Antwoord 2, Autoriteit 14%

Eenvoudig beantwoorden variable modified array at file scope is not possible.

Gedetailleerd:

MAAK IT COMPILE TIME integral constant expression, aangezien de lengte van de array op de compileertijd moet worden opgegeven.

Zoals dit:

#define a 6
#define b 3

Volg de C99-standaard. en compileer zoals voor GCC.

gcc -Wall -std=c99 test.c -o test.out

Het probleem hier is de reeks van variabele lengte met het verlenen van lengte mag niet worden geïnitialiseerd, zodat u deze fout krijgt.

gewoon

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.
}

Gebruik nu voor lus of elke lus om de array te vullen.

Voor meer informatie slechts een 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. 

Als u statische verwijdert en initialisatie wilt aanbieden, genereert deze fout zoals hierboven.

Maar als u zowel statisch als initialisatie behoudt, is het nog steeds fout.

Maar als u de initialisatie verwijdert en behoudt staticzal de onderstaande fout komen.

error: variable length array declaration not allowed at file scope
static int Hello[a];
           ^     ~
1 error generated.

Zo variabele lengte-arrayverklaring niet toegestaan ​​bij bestandscope, dus maak het functioneren of blokkoper in elke functie (maar onthoud dat het functioneren van de functie initialisatie moet verwijderen)

OPMERKING: Aangezien het Cis getagd, dus het maken van aen bals consthelpt u niet, maar In C++constwerkt prima.


Antwoord 3

Bij gebruik van Clang / LLVM de volgende werken:

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}
}; 

(Om het in de gegenereerde montage te zien, moet men hallo gebruiken, zodat deze niet wordt geoptimaliseerd)

Dit zal echter een fout genereren als de C99-modus is geselecteerd (-std = C99),
Het genereert alleen een waarschuwing (WGNU-vouwconstante) als -pedanticus is geselecteerd.

GCC lijkt dit niet toe te staan (const wordt geïnterpreteerd als alleen-lezen)

Zie uitleg in deze thread:

“Initializer Element is geen constante “fout zonder reden in Linux GCC, compileren C


Antwoord 4

Ja, dit is Annnoying:

const int len = 10;
int stuff[len];

geeft de fout. Ik probeer weg te komen van #define X, omdat const int een betere manier is om een constante te verklaren, maar dan heb je deze gevallen waarin const int niet een echte constante is, ook al weet de compiler het is.

Other episodes