2012-11-01 23 views
30

Eventuali duplicati:
Const vs Static ConstQual è la differenza tra const const e const?

Qual è la differenza tra static const e const? Per esempio:

static const int a=5; 
const int i=5; 

C'è qualche differenza tra loro? Quando utilizzeresti uno sull'altro?

+0

@EtiennedeMartel "static è il comportamento predefinito" Certamente no. Qualunque cosa ti ha dato questa idea? –

+2

Correlato: http://stackoverflow.com/questions/6381088/const-vs-static-const – halex

+2

Votato per la riapertura. Il "duplicato" sta facendo una domanda completamente diversa, specifica per l'utilizzo della memoria. Questa domanda pone una domanda più generale sulla differenza. – rmaddy

risposta

25

La differenza è il collegamento.

// At file scope 
static const int a=5; // internal linkage 
const int i=5;   // external linkage 

Se l'oggetto i non viene utilizzato al di fuori l'unità di traduzione in cui è definito, si dovrebbe dichiararla con l'static identificatore.

Ciò consente al compilatore (potenzialmente) di eseguire ulteriori ottimizzazioni e informa il lettore che l'oggetto non viene utilizzato al di fuori della sua unità di traduzione.

+3

+1 Sarebbe bello poter aggiungere anche ciò che significa se quelle dichiarazioni sono all'interno di una funzione. – Praetorian

+0

Sei sicuro che 'const int i = 5;' ha un collegamento esterno ?? In C++ non ... –

+4

@KerrekSB su file-scope, sì. * (C99, 6.2.2p5) "Se la dichiarazione di un identificatore per un oggetto ha scope di file e nessun identificatore di classe di memoria, il suo collegamento è esterno." * – ouah

40

statico determina la visibilità al di fuori di una funzione o una vita di variabili all'interno. Quindi non ha nulla a che fare con cost di per sé.

const significa che non si modifica il valore dopo l'inizializzazione.

statico all'interno di una funzione indica che la variabile esiste prima e dopo la fine della funzione.

statico all'esterno di una funzione significa che l'ambito del simbolo contrassegnato come statico è limitato a tale file .c e non può essere visto al di fuori di esso.

Tecnicamente (se si desidera cercare questo), static è uno specificatore di memoria e const è un qualificatore di tipo.

+0

spiegazione semplice, grazie! – Alec

0

Dipende se queste definizioni si trovano all'interno di una funzione oppure no. La risposta per il caso all'esterno di una funzione è data da ouah, sopra. All'interno di una funzione l'effetto è diverso, illustrato dal seguente esempio:

#include <stdlib.h> 

void my_function() { 
    const int foo = rand();   // Perfectly OK! 
    static const int bar = rand(); // Compile time error. 
} 

Se si desidera una variabile locale di essere "davvero costante," è necessario definire non solo "const", ma "static const".

+0

Compila perfettamente per me ... Ma so che è stupido avere una variabile const statica in questo caso. – DrumM

Problemi correlati