Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-12-2010, 17:17   #1
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
[C] Variabili globali e header files

Sto facendo un programma in cui ho la necessità di utilizzare più *.c file e 1 *.h file .
Il programma necessità di una variabile globale.
Mi sono imbattuto però nel problema che dichiarandola e definendola nel file *.h ( incluso in TUTTI i file *.c ) il linker mi dice che la variabile è dublicata.
Ho cercato un po' su internet e ho visto che non sono stato l'unico ad avere questo problema.
Ho trovato una soluzione ma non mi sono ben chiari alcuni concetti:
  1. Nel file *.header la variabile è dichiarata come segue:
    Codice:
    extern int max_game_time;
    Perchè devo metterla extern? Cosa ottengo facendo così?
  2. Nei due file *.c la variabile è dichiarata così:
    Codice:
    int max_game_time;
    Mi sarei aspettato invece di poter dichiarare la variabile globale nel file header e porla subito uguale a 0, e lasciarla solo dichiarata negli altri due file *.c . Invece non si può... Come mai?

Detto questo, è corretto questo modo di dichiarare variabili globali in file header inclusi in più *.c file?
C'è un modo migliore?

Inoltre, cosa significano:
Codice:
#ifndef _NOMEHEADER_H_
#define _NOMEHEADER_H_

...

#endif
A cosa servono?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2010, 22:56   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Mi sembra di ricordare che per avere una variabile globale la devi dichiarare normalmente in uno dei file .c e in tutti gli altri dichiararla come extern.

Codice:
#ifndef _NOMEHEADER_H_
#define _NOMEHEADER_H_

...

#endif
Queste sono direttive per il preprocessore, ifndef e define in particolare vengono usate in questo modo per assicurarsi che la parte all'interno dell'if non venga interpretata dal preprocessore più di una volta.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 00:19   #3
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
allora diciamo che questa:

Codice:
int var;
è la definizione della variabile, che alloca lo spazio di cui necessita e ce ne può essere una sola

questa invece:

Codice:
extern int var;
è una dichiarazione della variabile, che crea "un buco" nell'oggetto compilato che è compito del linker riempire

la definizione deve essere una sola, le dichiarazioni possono essere tante, per cui la soluzione che si utilizza di solito è inserire le dichiarazioni nei file header, che possono essere incluse quante volte si vuole (nel senso in quanti file vuoi)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 01:05   #4
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da kwb Guarda i messaggi
Sto facendo un programma in cui ho la necessità di utilizzare più *.c file e 1 *.h file .
Il programma necessità di una variabile globale.
Mi sono imbattuto però nel problema che dichiarandola e definendola nel file *.h ( incluso in TUTTI i file *.c ) il linker mi dice che la variabile è dublicata.
Ho cercato un po' su internet e ho visto che non sono stato l'unico ad avere questo problema.
Ho trovato una soluzione ma non mi sono ben chiari alcuni concetti:
  1. Nel file *.header la variabile è dichiarata come segue:
    Codice:
    extern int max_game_time;
    Perchè devo metterla extern? Cosa ottengo facendo così?
  2. Nei due file *.c la variabile è dichiarata così:
    Codice:
    int max_game_time;
    Mi sarei aspettato invece di poter dichiarare la variabile globale nel file header e porla subito uguale a 0, e lasciarla solo dichiarata negli altri due file *.c . Invece non si può... Come mai?

Detto questo, è corretto questo modo di dichiarare variabili globali in file header inclusi in più *.c file?
C'è un modo migliore?

Inoltre, cosa significano:
Codice:
#ifndef _NOMEHEADER_H_
#define _NOMEHEADER_H_

...

#endif
A cosa servono?
Probabilmente la soluzione che cerchi (più semplice) è mettere la dichiarazione della variabile nello header e includere lo header nei due file sorgente in cui ne hai bisogno.

Codice:
/*header.h*/
int myVar;

/*file1.c*/
#include "header.h"
[...]
void changeIt()
{
    myVar = 1;
}
[...]

/*file2.c*/
#include "header.h"
[...]
int main()
{
    changeIt();
    printf("%d\n", myVar);

    return (0);
}
[...]
Oppure in alternativa, mettere in uno header appunto la direttiva "extern" che come dice tuccio dice al compilatore di non allocare nuovo spazio per la variabile e permetterà al linker di risolvere l'indirizzo necessario.
Ricorda che alla direttiva "extern" devono seguire tutti gli attributi della variabile "originale", se per esempio dichiari la variabile "originale" con la keyword "volatile", a seguito della keyword "extern" dovrai far sempre seguire anche la keyword "volatile" (oltre al tipo e al nome della variabile). E cosi via.

L'uso delle direttive del preprocessore
Codice:
#ifndef SOMETHING_H
#define SOMETHING_H
#endif
meglio conosciuto come include guard serve per evitare errori in fase di compilazione come quelli che hai tu, ovvero di ritrovarsi con duplice definizione di variabili o include ciclici.
Dice al precompilatore (in fase di precompilazione e quindi quando un file deve essere incluso in un'altro file) esattamente:
- se non esiste alcuna definizione della macro SOMETHING_H
- dichiara SOMETHING_H
- includi il corpo dello header
- fine

Se dopo
Codice:
#endif
Dichiari qualcosa questo verrà sempre incluso ogni volta.

Anche se spesso si assume che la include guard permetta di impedire l'inclusione del file .h se la macro è già presente, questo non è corretto. Il precompilatore, infatti ogni volta include il file .h ed analizza la condizione, se la condizione è vera include il corpo, altrimenti include il file comunque ma escludendo tutto quello che c'è tra #ifndef e #endif (nel nostro caso un file vuoto se non specifichiamo altro prima di #ifndef o dopo #endif).

Alcuni compilatori supportano la direttiva
Codice:
#pragma once
. Questa invece permette di ottimizzare la fase di precompilazione permettendo al precompilatore di sapere quando un file deve essere incluso solo una volta e attivando (se supportati) ottimizzazioni per velocizzare il processo.
Nel caso questa direttiva non sia supportata viene semplicemente ignorata (non sono mai venuto a conoscenza di compilatori che segnalano errori per una direttiva pragma non supportata).

Volendo potresti mescolare la direttiva pragma e la include guard per supportare tutti i compilatori e al tempo stesso sfruttare l'ottimizzazione dei compilatori che supportano la suddetta pragma.
esempio:
Codice:
#ifndef FILE_H
#define FILE_H
#pragma once

#endif /*FILE_H*/
Beh, è ora di andare a
Ciao!

Ultima modifica di Opcode : 10-12-2010 alle 01:09.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 16:36   #5
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Mi sembra di ricordare che per avere una variabile globale la devi dichiarare normalmente in uno dei file .c e in tutti gli altri dichiararla come extern.
Ho la necessità che la variabile si trovi in un file H e non C

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
allora diciamo che questa:

Codice:
int var;
è la definizione della variabile, che alloca lo spazio di cui necessita e ce ne può essere una sola

questa invece:

Codice:
extern int var;
è una dichiarazione della variabile, che crea "un buco" nell'oggetto compilato che è compito del linker riempire

la definizione deve essere una sola, le dichiarazioni possono essere tante, per cui la soluzione che si utilizza di solito è inserire le dichiarazioni nei file header, che possono essere incluse quante volte si vuole (nel senso in quanti file vuoi)
Ok quindi è corretto come ho fatto prima, no?
Ovvero, nell'header H
Codice:
extern int variabile;
E negli altri file C:
Codice:
int variabile;
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Probabilmente la soluzione che cerchi (più semplice) è mettere la dichiarazione della variabile nello header e includere lo header nei due file sorgente in cui ne hai bisogno.

Codice:
/*header.h*/
int myVar;

/*file1.c*/
#include "header.h"
[...]
void changeIt()
{
    myVar = 1;
}
[...]

/*file2.c*/
#include "header.h"
[...]
int main()
{
    changeIt();
    printf("%d\n", myVar);

    return (0);
}
[...]
Ci ho già provato ma questo semplice codice non funziona

Quote:
Originariamente inviato da Opcode Guarda i messaggi
Oppure in alternativa, mettere in uno header appunto la direttiva "extern" che come dice tuccio dice al compilatore di non allocare nuovo spazio per la variabile e permetterà al linker di risolvere l'indirizzo necessario.
Ricorda che alla direttiva "extern" devono seguire tutti gli attributi della variabile "originale", se per esempio dichiari la variabile "originale" con la keyword "volatile", a seguito della keyword "extern" dovrai far sempre seguire anche la keyword "volatile" (oltre al tipo e al nome della variabile). E cosi via.
Ok, capito!

Quote:
Originariamente inviato da Opcode Guarda i messaggi
L'uso delle direttive del preprocessore
Codice:
#ifndef SOMETHING_H
#define SOMETHING_H
#endif
meglio conosciuto come include guard serve per evitare errori in fase di compilazione come quelli che hai tu, ovvero di ritrovarsi con duplice definizione di variabili o include ciclici.
Dice al precompilatore (in fase di precompilazione e quindi quando un file deve essere incluso in un'altro file) esattamente:
- se non esiste alcuna definizione della macro SOMETHING_H
- dichiara SOMETHING_H
- includi il corpo dello header
- fine

Se dopo
Codice:
#endif
Dichiari qualcosa questo verrà sempre incluso ogni volta.

Anche se spesso si assume che la include guard permetta di impedire l'inclusione del file .h se la macro è già presente, questo non è corretto. Il precompilatore, infatti ogni volta include il file .h ed analizza la condizione, se la condizione è vera include il corpo, altrimenti include il file comunque ma escludendo tutto quello che c'è tra #ifndef e #endif (nel nostro caso un file vuoto se non specifichiamo altro prima di #ifndef o dopo #endif).

Alcuni compilatori supportano la direttiva
Codice:
#pragma once
. Questa invece permette di ottimizzare la fase di precompilazione permettendo al precompilatore di sapere quando un file deve essere incluso solo una volta e attivando (se supportati) ottimizzazioni per velocizzare il processo.
Nel caso questa direttiva non sia supportata viene semplicemente ignorata (non sono mai venuto a conoscenza di compilatori che segnalano errori per una direttiva pragma non supportata).

Volendo potresti mescolare la direttiva pragma e la include guard per supportare tutti i compilatori e al tempo stesso sfruttare l'ottimizzazione dei compilatori che supportano la suddetta pragma.
esempio:
Codice:
#ifndef FILE_H
#define FILE_H
#pragma once

#endif /*FILE_H*/
Beh, è ora di andare a
Ciao!
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Codice:
#ifndef _NOMEHEADER_H_
#define _NOMEHEADER_H_

...

#endif
Queste sono direttive per il preprocessore, ifndef e define in particolare vengono usate in questo modo per assicurarsi che la parte all'interno dell'if non venga interpretata dal preprocessore più di una volta.
Ma quindi non mi è chiara tutta questa spiegazione se basta scrivere nel file H:
Codice:
#ifndef HEADER_H_
#define HEADER_H_

int variabile_globale;

#endif
per avere la variabile globale inclusa in entrambi i file C .
Quale è meglio? Usare extern? O l'ifndef?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 18:02   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Mi sa che hai fatto un po' di confusione. Direi che tuccio ha spiegato molto chiaramente l'uso di extern, prova a rileggere meglio il suo post.

E su #ifndef e #define provo a farti un esempio.
Tanto per cominciare bisogna sapere che la direttiva #include non fa altro che sostituire l'istruzione #include con il contenuto del file specificato.
Detto questo guarda questo esempio (stupido ma esplicativo):
Codice:
// file header.h

int var;

// file header2.h

#include "header.h"

// file source.c

#include "header.h"
#include "header2.h"
La compilazione di source.c fallisce perché var risulta definita 2 volte: una per via dell'inclusione di header.h e un'altra perché includendo header2.h viene reincluso anche header.h.
Usando ifndef e define:
Codice:
// file header.h

#define _HEADER_
int var;

// file header2.h

#ifndef _HEADER_
#include "header.h"
#endif

// file source.c

#ifndef _HEADER_
#include "header.h"
#endif
#include "header2.h"
Il preprocessore analizza source.c e trova l'istruzione #ifndef _HEADER_. Esso non è ancora stato definito quindi viene incluso header.h, il quale definisce _HEADER_. Successivamente viene incluso header2.h ma header non viene reincluso perché _HEADER_ è definito.
Ovviamente puoi mettere #ifndef e #define un po' dove ti pare purché abbia senso, io ho messo define in header.h invece che subito dopo #ifndef.

Ultima modifica di wingman87 : 10-12-2010 alle 18:03. Motivo: Errore di battitura
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 18:20   #7
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Bene, però sia usando il metodo che ho spiegato all'inizio, sia questo dell'ifndef, ottengo lo stesso risultato, ovvero di poter dichiarare una variabile globale in un header e utilizzare lo stesso header in più file.
La mia domanda ora è: quale metodo conviene utiizzare? Quale, dal punto di vista dell'ottimizzazione, è migliore?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 19:05   #8
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ci ho già provato ma questo semplice codice non funziona
Ovviamente devi aggiungere ai file gli header necessari ed esportare il prototipo della funzione changeIt affinchè funzioni, io ti ho riportato solo le parti di interesse.

[edit]
La risposta alla tua domanda stà nel design della tua applicazione e come/dove usi la variabile.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 19:09   #9
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Per avere una variabile globale devi fare come ti dicevo nel mio primo post e come diceva anche tuccio. La definisci in un solo file e in tutti gli altri la dichiari con la parola chiave extern. Se poi la definisci/dichiari direttamente o indirettamente (cioè definendola/dichiarandola in un header e poi includendolo) non è rilevante, la cosa importante è che poi fai le inclusioni giuste.

Il discorso su ifndef e define è un discorso a parte.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 19:12   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Ovviamente devi aggiungere ai file gli header necessari ed esportare il prototipo della funzione changeIt affinchè funzioni, io ti ho riportato solo le parti di interesse.
A me quell'esempio non sembra corretto perché file1.c e file2.c definiscono 2 istanze diverse della variabile myVar.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 21:06   #11
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Per avere una variabile globale devi fare come ti dicevo nel mio primo post e come diceva anche tuccio. La definisci in un solo file e in tutti gli altri la dichiari con la parola chiave extern. Se poi la definisci/dichiari direttamente o indirettamente (cioè definendola/dichiarandola in un header e poi includendolo) non è rilevante, la cosa importante è che poi fai le inclusioni giuste.

Il discorso su ifndef e define è un discorso a parte.
Si ma continuo a non capire perchè dici che il discorso dell'ifndef è una cosa diversa, non è proprio ciò che calza per le mie neccesità?

Inoltre usando l'ifndef risolvo il problema.
Certo aggiungendo ora nel main:
Codice:
extern int max_game_time;
Non da problemi ( rimane sempre il fatto che non posso definirla uguale a 0, cmq... ), però non è un surplus?

Ora, immagino funzioni uguale anche se io tolgo gli ifndef, però se si dovesse fare una comparazione, è meglio, a livello di risorse, usare l'ifndef e includere il file H dentro tutti i file C o dichiarare la variabile normalmente nel file H ( senza ifndef ) e dichiarla extern in tutti i file C?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 22:32   #12
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
A me quell'esempio non sembra corretto perché file1.c e file2.c definiscono 2 istanze diverse della variabile myVar.
Fai presto a provarlo. Dimmi poi se funziona o no.

A livello di "risorse" non ti cambia proprio nulla. Allochi sempre e solo una variabile.
L'IFNDEF non ha niente a che fare con la dichiarazione di una variabile, è un meccanismo di sicurezza per evitare errori dovuti ad una doppia inclusione dello stesso file header.

Ultima modifica di Opcode : 10-12-2010 alle 22:35.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2010, 23:53   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Quote:
Originariamente inviato da Opcode Guarda i messaggi
Fai presto a provarlo. Dimmi poi se funziona o no.
E' vero, funziona... Allora non capisco a cosa serve extern
Può essere per via del compilatore? Oppure è quello il comportamento corretto? Non mi convince...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2010, 11:58   #14
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Da quel che ne deduco, in questo caso non fa differenza il modo con cui si ottiene il risultato ( ovvero avere una variabile globale in un header incluso in più file C ) visto che, da quel che mi dite, le risorse allocate sono sempre uguali.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2010, 16:30   #15
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
E' vero, funziona... Allora non capisco a cosa serve extern
Può essere per via del compilatore? Oppure è quello il comportamento corretto? Non mi convince...
I compilatori ed i linker più recenti sono in grado di assumere per default che una variabile con lo stesso nome e dello stesso tipo sono riferimenti alla stessa locazione di memoria. Una sorta di auto-extern se vogliamo. Ovviamente se provi a dichiararne il valore nello header avrai un errore per ogni inclusione, un errore di duplicazione della variabile.

Se vuoi vederci meglio su linux prova a compilare con la flag -E per vedere come si comporta il precompilatore, e con -S ti puoi studiare il codice assembly prodotto, vedi che l'asm dichiara la variabile nel file del main.

Quote:
Originariamente inviato da kwb Guarda i messaggi
Da quel che ne deduco, in questo caso non fa differenza il modo con cui si ottiene il risultato ( ovvero avere una variabile globale in un header incluso in più file C ) visto che, da quel che mi dite, le risorse allocate sono sempre uguali.
Il metodo da purista è quello di evitare la definizione di variabili nello header, ma limitarsi a dichiararla preceduta dalla keyword extern.
Il mio era un esempio sfruttabile con i recenti compilatori, se provi funzionerà anche su gcc con le flag -pedantic -ansi -Wall per il comportamento descritto sopra.

Se definisci la variabile con un valore nello header avrai un problema se importi lo header in altri file, ma se la definisci senza valore o dichiari con la keyword extern non avrai problemi (sulla multipla definizione non sò quali compilatori e da che versione la supportino, ma è una cosa che và già da almeno un paio di anni a questa parte).

E comunque sei sicuro che la variabile viene sempre e solo allocata una volta, perchè altrimenti ci sarebbe una corrispondenza dell'identificatore nella tabella dei simboli che causerebbe un errore per multipla definizione.
Opcode è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2010, 17:52   #16
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Quote:
Originariamente inviato da Opcode Guarda i messaggi
I compilatori ed i linker più recenti sono in grado di assumere per default che una variabile con lo stesso nome e dello stesso tipo sono riferimenti alla stessa locazione di memoria. Una sorta di auto-extern se vogliamo.
Grazie per le informazioni. Era quello che sospettavo. Ad ogni modo non mi sembra buona pratica sfruttare questa feature del compilatore. Inoltre usando extern possiamo accorgerci di eventuali errori nel caso in cui senza accorgercene dichiariamo la variabile con un nome leggermente diverso. E possiamo anche inizializzare la variabile laddove è definita.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2010, 19:15   #17
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Grazie a tutti, tutto chiaro!
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 11-12-2010, 21:13   #18
Opcode
Member
 
L'Avatar di Opcode
 
Iscritto dal: Jun 2010
Città: Asti
Messaggi: 85
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Grazie per le informazioni.
Quote:
Originariamente inviato da kwb Guarda i messaggi
Grazie a tutti, tutto chiaro!
Di nulla =))
...quando si può fà piacere condividere.

Ciao e buona serata ad entrambi.
Opcode è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
Le nuove offerte Amazon sono eccezionali...
Il pieghevole Android definitivo? Motoro...
Stop a muffa e umidità spendendo ...
Super sconto su una scopa elettrica pote...
Windows 10 si aggiorna: cosa cambia con ...
Questo è il motore della BMW M el...
Starlink sugli aerei Lufthansa: Internet...
Meta ridimensiona la VR: ondata di licen...
Coupon Amazon nascosti di gennaio 2026, ...
PC completo, grande schermo e zero ingom...
Windows 11, rilasciato il primo aggiorna...
Riscaldamento smart, bollette giù: i kit...
Casa smart spendendo pochissimo: termost...
Apple accelera sull'AI: chip server prop...
Tesla, basta Full Self-Driving come pack...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v