Per rispondere alla domanda, "lo statico significa che è stata creata solo una copia di VAL, nel caso in cui l'intestazione sia inclusa da più di un file sorgente?" ...
NO . VAL sarà sempre definito separatamente in ogni file che include l'intestazione.
Gli standard per C e C ++ causano una differenza in questo caso.
In C, le variabili con ambito file sono esterne per impostazione predefinita. Se stai usando C, VAL è statico e ANOTHER_VAL è esterno.
Nota che i linker moderni possono lamentarsi di ANOTHER_VAL se l'intestazione è inclusa in file diversi (lo stesso nome globale definito due volte), e si lamenterebbero sicuramente se ANOTHER_VAL fosse inizializzato con un valore diverso in un altro file
In C ++, le variabili con ambito di file sono statiche per impostazione predefinita se sono const, ed esterne per impostazione predefinita se non lo sono. Se stai usando C ++, sia VAL che ANOTHER_VAL sono statici.
È inoltre necessario tenere conto del fatto che entrambe le variabili sono designate const. Idealmente, il compilatore sceglierebbe sempre di incorporare queste variabili e non includere alcuna memoria per esse. C'è tutta una serie di ragioni per cui è possibile allocare lo spazio di archiviazione. Quelli a cui riesco a pensare ...
- opzioni di debug
- indirizzo preso nel file
- il compilatore alloca sempre lo spazio di archiviazione (i tipi const complessi non possono essere facilmente inline, quindi diventa un caso speciale per i tipi di base)