2013-08-14 11 views
6

Ho una variabile globale e una variabile locale con gli stessi nomi. Posso copiare la variabile locale nella variabile globale (assign) senza prima assegnare il valore della variabile globale ad una variabile temporanea (usando extern) e quindi assegnare la variabile temporanea alla variabile globale? Ho bisogno di fare qualcosa di simile:Come copiare la variabile locale sulla variabile globale se entrambi hanno lo stesso nome in C senza utilizzare una terza variabile?

#include<stdio.h> 
int myVariable = 50; 
void myFunction() 
{ 
    int myVariable; 
    myVariable /*global*/ = myVariable /*local*/; 
} 

C'è qualche modo in C per farlo (senza l'utilizzo di variabili temporanee (o puntatori in caso di array))? Ho trovato che è possibile in C++, Java o C# utilizzando parole chiave come questa, super, di base, ecc, ma non riusciva a trovare una soluzione in C.

Ho già accennato al How can I access a shadowed global variable in C?

+8

Sì, è possibile. Non usare 'myVariable' in ambito locale. – deepmax

+4

possibile duplicato di [Come posso accedere a una variabile globale ombreggiata in C?] (Http://stackoverflow.com/questions/618769/how-can-i-access-a-hadow-global-variable-in-c) – Macattack

+0

Se è possibile scrivere codice per eseguire la copia, c'è qualcosa che ti impedisce di sostituire il nome della variabile locale con qualcosa che non sia in conflitto con il nome globale? – WhozCraig

risposta

13

In C99 non è possibile specificare l'ambito specifico della variabile/costante che si desidera utilizzare. Si riferirà automaticamente all'ambito più interno quando si fa riferimento a una variabile/costante.

Dalla C99 standard di 6.2.1.4:

... Se un identificatore designa due entità diverse nello stesso spazio dei nomi, gli scopi potrebbero sovrapporsi. In tal caso, l'ambito di una entità (l'ambito interno) sarà un sottoinsieme rigoroso dell'ambito dell'altra entità (l'ambito esterno). All'interno dell'ambito interno, l'identificatore designa l'entità dichiarata nello scope interno; l'entità dichiarata nello scope esterno è nascosta (e non visibile) all'interno dell'ambito interno ...

Quindi, come potrei aggirare questo?

Semplice, cambiare il nome della variabile ambito più interno :)

-2

Che cosa si sta facendo sta "oscurando" la variabile globale. Per cancellarlo in un blocco locale, dichiararlo nel suo blocco annidato con extern.

void myFunction() 
{ 

    int myVariable 
    { 
    extern int myVarible; 
    //modify myVariable global here; 

    } 
    //modify myVariable localhere 
} 
+1

Ciò richiede una variabile temporanea e non soddisfa la domanda. – deepmax

+0

Non è una variabile temporanea, è la variabile globale. – Magn3s1um

+0

La sua domanda sta chiedendo come copiare dall'ambito più interno a una variabile di ambito più esterna con lo stesso nome. La tua soluzione non soddisfa questo (tuttavia spiega ombreggiatura variabile - non quello che ha chiesto). –

1

Does un conteggio struct come un'altra variabile?

#include<stdio.h> 

struct Global { 
    int myVariable; 
} g; 

void myFunction() 
{ 
    int myVariable = 50; 
    g.myVariable /*global*/ = myVariable /*local*/; 
} 

Questo dovrebbe fare qualcosa come chiedi informazioni.

+3

(+1), perché si tratta di un lavoro intelligente. Ma, (-1) dal momento che implicitamente non è ciò che l'OP voleva fare - semmai questo è più un lavoro che una variabile/costante temporanea. –

+0

+1 Una soluzione simile che ho visto un paio di volte è di iniziare il nome di ogni variabile globale con "g_". – kol

-1

1) utilizzare il valore restituito:

#include<stdio.h> 
int myVariable = 50; 

int myFunction1() 
{ 
    int myVariable; 
    return myVariable; 
} 

2) utilizzare un puntatore:

void myFunction2(int * pp) 
{ 
    int myVariable; 
    *pp = myVariable; 
} 

utilizzati:

int main(void) { 

myVariable = myFunction1(); 

/* or ... */ 
myFunction2 (&myVariable); 

return 0; 
} 

}

+0

(-1), non capisco nessuno degli esempi. Nel primo si avrà un errore che dice "raggiunto la fine della funzione non vuoto", il secondo non ha modifiche ma il tipo di parametro e l'utilizzo non sono chiari poiché non so quali siano i primi due punti ... –

+0

Ero ancora impegnato nel montaggio. (e capire la domanda che non ha molto senso per me) Entrambe le versioni non usano alcuna variabile extra (il puntatore potrebbe essere visto come una variabile, ma l'argomento attuale è un'espressione puntatore, e questa "variabile" scompare una volta che la funzione è tornato.) - wildplasser 33 secondi fa – wildplasser

6

Questo è orribile, ma in GNU C, puoi farlo con:

* ({ extern int myVariable; &myVariable; }) = myVariable; 

Vieni a pensarci bene, che potrebbe servire in serie C con una funzione di supporto:

static int * GlobalMyVariable(void) { return &myVariable; } 
… 
*GlobalMyVariable() = myVariable; 

Naturalmente, è chiesto alcun variabili temporanee, e questo non usa una variabile temporanea, ma lo fa, a prima vista, aggiungi "cose" al tuo eseguibile. Tuttavia, ho compilato un semplice utilizzo di questo con l'ottimizzazione, e la funzione helper è completamente scomparsa nel codice di assembly generato. Quindi non significa nessun codice o dati aggiuntivi, quando il compilatore si ottimizza correttamente.

+3

+1 Ho provato questo codice incredibile, e funziona :) Link: http://ideone.com/Kmxd1s – kol

+0

La seconda soluzione mi sembra buona, non usa una terza variabile. Hai ispirato il mio approccio di seguito. – chux

+1

@Eric wow! molte grazie! :-) –

1

Aggiungere un puntatore int costante globale.

OP: Come copiare la variabile locale sulla variabile globale se entrambi hanno gli stessi nomi di matrice in C senza utilizzare una terza variabile?
Ho barato e non sto usando una terza variabile ma una costante. (mi sono intrufolato nella porta?)

OP: senza prima assegnare il valore della variabile globale a una variabile temporanea (utilizzando extern) e quindi assegnando la variabile temporanea alla variabile globale?
Appare passare questo test - nessuna variabile temporanea utilizzata.

OP: in qualche modo in C per farlo (senza utilizzare variabili temporanee (o puntatori nel caso di matrici))?
Beh, non usare un temporaneo, dato che i globals sono permanenti. E non sta usando un puntatore tramite un array. è utilizzando un puntatore.

int myVariable = 50; 
int *const myVariableAddress = &myVariable; 

void myFunction() { 
    // Could be here instead with 
    // static int *const myVariableAddress = &myVariable; 
    { 
    int myVariable; 
    *myVariableAddress = myVariable /*local*/; 
    } 
} 
1

questo funziona, ma il codice deve essere in un oggetto condiviso, o il programma deve essere compilato in un modo che lascia l'eseguibile vedere i propri simboli globali (nel GCC, si utilizza il flag -rdynamic) :

int myVariable = 50; 

void myFunction() { 
    int myVariable = 10; 
    *(int *)dlsym(0, "myVariable") = myVariable; 
} 
-1
::myGlobal = myLocal 

Questo dovrebbe essere in grado di accedere alla variabile dal campo di applicazione globale.

Problemi correlati