2010-05-06 13 views
8

In C static può significare una variabile locale o una funzione/variabile globale senza collegamento esterno. In C++ può anche significare una variabile membro o una funzione membro per classe.Come è accaduto che "statico" denoti una funzione/variabile senza collegamento esterno in C e C++?

C'è qualche riferimento a come è successo che la parola chiave static che sembra totalmente irrilevante per mancanza di collegamento esterno viene utilizzata per indicare la mancanza di collegamento esterno?

risposta

4

static è un identificatore di memorizzazione. La parola "statico" significa immutabile. "Memoria" si riferisce a dove l'oggetto è in memoria, cioè il suo indirizzo.

Un oggetto con memoria static risiede su un indirizzo costante.

Si dà il caso che un oggetto con lo spazio extern disponga anche di un indirizzo costante. A causa del modo in cui i programmi C e C++ sono collegati, è una necessità. E poiché il extern sembra essere il comportamento meno sorprendente, è anche l'impostazione predefinita.

Se ci si pensa in termini di extern come caratteristica aggiuntiva su static, penso che abbia un po 'più senso. È un po 'stupido dichiarare una funzione static, poiché non c'è alternativa in nessun linguaggio completamente compilato, ma l'indirizzo di una funzione è statico anche se non è visibile esternamente.

La parte veramente incoerente, quindi, è che i membri della classe che vengono condivisi tra le diverse unità di compilazione devono essere dichiarati static, non extern ...

6

L'utilizzo di una parola chiave già esistente presenta il vantaggio di non aggiungere una nuova parola chiave alla lingua, che potrebbe interrompere i programmi esistenti. Può essere fonte di confusione ma è considerato una sorta di "male minore".

+3

E static ha, come gran parte della parola chiave C++, un significato dipendente dal contesto. – Klaim

6

Presumo che si consideri l'uso di statico per definire variabili che mantengono il loro valore tra le chiamate di funzione per essere naturali.

Si consideri il seguente:

void func() { 
    static int x; 
} 

contro

int x; 
void func() { 
} 

Dal punto di vista func s', x si comporta lo stesso in entrambi i casi. Il valore rimane tra chiamate consecutive. La differenza tra i due è chi può vedere x. Nel primo, nessuno può. Nel secondo, tutti possono.

Questo concetto si estende a variabili statiche nell'ambito globale. Se dichiari semplicemente una variabile, tutti possono vederla. Ma se dichiari che la variabile statica, solo quel file può vederla. Ovviamente, è necessario tenere conto del fatto che non c'è spazio per limitare la visibilità, ma l'idea è lì.

Il significato aggiuntivo in C++ relativo agli elementi statici è anche direttamente analogo all'esempio originale. Una singola variabile condivisa da tutte le istanze della classe.

+0

Non sono affatto contento della mia formulazione qui: -/Fondamentalmente, quello che sto cercando di superare è che tutti e tre gli usi determinano essenzialmente una variabile globale che è limitata allo scope corrente. –

+0

Questo è esattamente ** il motivo. Non capisco come la risposta sopra (totalmente inutile) abbia più voti! – Shahbaz

+0

Tuttavia, il significato della variabile di classe fa girare una chiave nella parte "limitata allo scope corrente". 'classe X {public: static int foo; }; 'dichiara un X: pippo globalmente visibile (anche se richiede il qualificatore' X :: '). – cHao

2

La versione C significa "legato staticamente" al di fuori di una funzione.

La versione di classe C++ e le versioni di funzione C inside significano "stored static", ovvero non sono variabili auto (stack o locali) o variabili di istanza nelle classi.

Problemi correlati