2013-03-10 7 views
5

Codice:Come accedere variabile globale quando c'è un conflitto locale e globale

int a = 33; 
int main() 
{ 
    int a = 40; // local variables always win when there is a conflict between local and global. 
    // Here how can i access global variable 'a' having value '33'. 
} 

Se si chiede: Perché qualcuno dovrebbe voler fare cosa di cui sopra? Perché [a-zA-Z] *?

La mia risposta sarebbe: solo per sapere che "è possibile farlo".

Grazie.

+0

http://stackoverflow.com/questions/5827447/how-refer-to-a-local-variable-share-same-name-of-a-global-variable-in-c –

+0

sua in realtà una buona domanda, ma cosa è '[a-zA-Z] *'? –

+2

Significa qualsiasi domanda che inizia con "Perché" e termina con "?" per esempio. Perché vuoi accedere a globale qui? o perché blah blah blah blah? – VishalDevgire

risposta

12

ne dite di questo vecchio trucco:

int main() 
{ 
    int a = 40; // local variables always win when there is a conflict between local and global. 

    { 
     extern int a; 
     printf("%d\n", a); 
    } 
} 
+1

+1 per picchiarmi di 30 secondi. –

+1

+1: bel trucco.non so di questo. – Heisenbug

+3

@R .. Per essere onesti, penso di averlo visto per la prima volta qualche tempo fa in uno dei tuoi post precedenti. – cnicutar

8
int a = 33; 
int main() 
{ 
    int a = 40; 
    int b; 
    { 
    extern int a; 
    b = a; 
    } 
    /* now b contains the value of the global a */ 
} 

Un problema più difficile è sempre a se è static con ambito di file, ma che è anche risolvibile:

static int a = 33; 
static int *get_a() { return &a; } 
int main() 
{ 
    int a = 40; 
    int b = *get_a(); 
    /* now b contains the value of the global a */ 
} 
+0

Perché non solo fare 'int b = a; int a = 40; '? Oppure, potrebbe il compilatore riordinare le linee in questo caso .... –

+0

In effetti potresti farlo. –

4

È C++, Ho scoperto l'etichetta C, DISPIACE!

int a = 100; 

int main() 
{ 
    int a = 20; 

    int x = a; // Local, x is 20 

    int y = ::a; // Global, y is 100 

    return 0; 
}