C variabler omfang i struct

stemmer
0

Jeg har møtt tre separate situasjoner i Cdet siste at jeg ville få hjelp på:

  1. Min Ckode har en global variabel:

    int ref_buf; //declared in a header file
    

    I en funksjonsdefinisjon bruker jeg det samme navnet som et parameter:

    void fun(int ref_buf, param2, param3)
    {
    }
    

    Vil det overskrive den opprinnelig definert global variabel, og det vil føre til feil?

  2. Kan jeg erklære en statisk variabel i en Cdatastruktur som så ?:

    struct my
    {
        int a;
        static int b;
    };
    

    Virker det? Er det noen spesiell situasjon hvor en trenger det?

  3. Kan jeg klargjøre en individuell struktur variabel som følger:

    struct my
    {
        int a;
        int b = 4;
    };
    
Publisert på 30/04/2009 klokken 13:33
kilden bruker
På andre språk...                            


7 svar

stemmer
7

Spørsmål 1

Alle referanser til ref_buf ved at funksjonen vil binde seg til den parameter og ikke den globale variable.

spørsmål 2

Dette er ikke lovlig i C, men er lovlig i C ++. Nøkkelordet statisk i C kan bare brukes på filen omfang variabler eller på lokalbefolkningen.

spørsmål 3

Nei dette er ikke lovlig i C (eller C ++). Du må opprette en fabrikk metode for å håndtere dette.

my create_my() {
  my m;
  m.b = 4;
  return m;
}
Svarte 30/04/2009 kl. 13:37
kilden bruker

stemmer
4

På Q3: GCC tillater deg å initialisere en struct som dette (som kreves av C99 standard):

struct
{
    int a;
    int b;
} my = { .b = 4 };

GCC doc på angitte initializers

Svarte 30/04/2009 kl. 13:46
kilden bruker

stemmer
2

1a) De lokale og globale variabler er separate enheter, og så den lokale man ikke vil overskrive den globale. Imidlertid vil den globale man ikke være tilgjengelig inne i funksjon (se også bemerker nedenfor).

1b) Det faktisk ikke feil, men det er garantert å skape forvirring og misforståelser fører til feil, så det er best å bruke forskjellige navn for hver.

2) Nei, det er ikke lovlig C. Du kan imidlertid gjøre hele struct statisk.

3) Nei, du gjør det på denne måten:

struct my
{
    int a;
    int b;
} = {0, 4};

Merknad 1: Variabler bør deklareres i .c filer, ikke .h filer. Hvis du trenger å gjøre en variabel tilgjengelig i flere filer, sette en extern erklæring i topptekstfilen.

Merknad 2: Unngå globale variabler hvis det er mulig.

Svarte 30/04/2009 kl. 17:16
kilden bruker

stemmer
0

På Q1:

Ikke erklære variabler i en header fil. Hvis du inkluderer som header filen i to kildefiler og kompilere kildefilene sammen, har du problemer. Kanskje din linker vil få deg ut av dem, kanskje ikke.

Hvis du virkelig trenger globale variabler, og det skjer mye mindre enn typiske nybegynnere tror, sette noe sånt extern int ref_buf;i topptekstfilen, og int ref_buf;i en kildefilen. Det betyr at det er en ref_buf, og alle andre kildefilene vil være i stand til å finne den.

Funksjonen parameteren er i det vesentlige en ny variabel med samme navn, og alle henvisninger i funksjon vil være å den. Du vil ikke være i stand til å få tilgang til global variabel innenfra denne funksjonen. Funksjonen genererer et indre omfang, og variabler som det vises til i en indre omfang er forskjellig fra de i et ytre. Dette er potensielt forvirrende, og gjør det enkelt å lage feil, så har variabler med samme navn og ulike omfang er generelt frarådes. (Variabler med samme navn i forskjellige struct definisjoner er vanligvis ikke forvirrende, siden du må spesifisere hva struct inneholder variabelen.)

Kompilatoren vil kompilere funksjon, men en god kompilator vil utstede en advarsel. Hvis den nekter å kompilere på grunn av en variabel skygge en annen av samme navn, er det ikke en ekte C-kompilator.

Svarte 30/04/2009 kl. 14:06
kilden bruker

stemmer
0
  1. Ja, vil det teknisk skrive, men en god kompilator vil advare deg om denne situasjonen, og du vil ha "advarsler = feil" på når du kompilere, så dette vil faktisk ikke kompilere.

  2. Ikke nødvendig, siden "min" struct er allerede erklært som statisk, og det er derfor erklært for hele struct. Dette allokerer minne for hele struct, så det er ingen grunn til å si "ta del av struct som allerede er statisk og gjøre den statisk".

  3. Nei, ikke i definisjonen, men du kan når du oppretter en "forekomst", noe sånt som:

    struct my MY =
    {
        {0, 4}
    };
    
Svarte 30/04/2009 kl. 13:49
kilden bruker

stemmer
0

1) Lokale variabler alltid ha forrang for eksempel

int ref = 10;

void fun(int ref)
{
  printf("\n%d\n", ref);
}

int main()
{
 fun(252);
 return 0;
}

viser: 252

Qs 2 og 3 vil ikke fungere i C.

Svarte 30/04/2009 kl. 13:48
kilden bruker

stemmer
0

Spørsmål 1: Jeg tror variabel deklarert i den lokale omfang tar precidence, bør det ikke overskrive den, men i omfang at variabelen er deklarert det vil bli brukt i stedet.

Det er forutsatt at det kompilerer.

Svarte 30/04/2009 kl. 13:36
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more