Domanda

Leggo alcune risposte su questo argomento, ma non sono ancora sicuro:

In C ++ Una definizione di variabile const global è automaticamente static. Tuttavia posso accedervi da un altro file CPP tramite extern:

// module.cpp

const int i = 0;
.

e

// main.cpp

extern const int i;

int main ()
{
    if (i > 10)
        return 0;
    else
        return 1;
}
.

Perché è possibile (accedere a un oggetto con collegamento interno da un altro modulo)? Normalmente dovrei essere costretto a definire i come extern const int i = 0 in module.cpp, per avere una cost cost esplicita globale ma non statistica o?

In confronto, questo non è possibile:

// module.cpp

static int i = 0;
.

e

// main.cpp

extern int i;

int main ()
{
    i = 10; // but read-only access like (i > 10) would be possible!
    return 0;
}
.

Così è la risposta che: Sì, è possibile accedere agli oggetti interni collegati da altri moduli, ma solo per lettura (quindi sempre con Const)?

Modifica:

Scusa, ma ho fatto un errore: Nel mio codice originale ho appena provato un'espressione senza effetti (in entrambi gli esempi):

extern const int i; // or extern int i for second example
int main ()
{
    i>10;
    return 0;
}
.

Ho pensato, che si comporta lo stesso, come se il flusso di programmi oi dati dipendessero da questa espressione, ma in realtà non lo fa! Il compilatore sembra semplicemente tagliare questa espressione senza effetti, in modo che il linker non lo veda! Quindi tutto va bene: nel primo esempio i deve essere effettivamente definito extern const int i = 0 in modulo.Cpp e nel secondo esempio i non è possibile accedere a tutti (a meno che non sia nell'espressione senza effetti). Il compilatore è VC ++ 2010.

Edit2:

Tuttavia, ora non capisco perché è possibile:

// module.cpp

extern const int i = 0;
.

e

// main.cpp

int i = 99;

int main ()
{
    bool b = i>10;
    return 0;
}
.

i dispone di un collegamento esterno. Ma nessun errore. Quando in Module.CPP I Definisci int i = 0, quindi errore (simboli multipli). Perché?

È stato utile?

Soluzione

Per quanto riguarda me sembra un bug del compilatore.La variabile costante non è definita è dichiarata solo in main.cpp.Per quanto riguarda la variabile I in Module.cpp ha quindi il collegamento interno e non deve essere accessibile al di fuori del modulo.

relativo alla tua aggiunta al post originale, il compilatore non ha nulla di comune con questa situazione.È un linker che controlla se ci sono simboli esterni duplicati.Penso che decise che se una variabile ha qualificatore Cost e altro non ha no, allora ci sono due diverse variabili.Penso che sia un'implementazione definita se il linker rilascerà un errore o meno.Inoltre può avere alcune opzioni che potrebbero controllare il comportamento del linker in tali situazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top