Para responder à pergunta, "o estático significa que apenas uma cópia do VAL é criada, caso o cabeçalho seja incluído por mais de um arquivo de origem?" ...
NO . VAL sempre será definido separadamente em cada arquivo que inclui o cabeçalho.
Os padrões para C e C ++ causam uma diferença neste caso.
Em C, as variáveis com escopo de arquivo são externas por padrão. Se você estiver usando C, VAL é estático e ANOTHER_VAL é externo.
Observe que os vinculadores modernos podem reclamar de ANOTHER_VAL se o cabeçalho for incluído em arquivos diferentes (mesmo nome global definido duas vezes), e definitivamente reclamariam se ANOTHER_VAL fosse inicializado com um valor diferente em outro arquivo
Em C ++, as variáveis com escopo de arquivo são estáticas por padrão se forem constantes e externas por padrão se não forem. Se você estiver usando C ++, VAL e ANOTHER_VAL são estáticos.
Você também precisa levar em consideração o fato de que ambas as variáveis são designadas como const. Idealmente, o compilador sempre escolheria incorporar essas variáveis e não incluir nenhum armazenamento para elas. Há uma série de razões pelas quais o armazenamento pode ser alocado. Eu posso pensar em ...
- opções de depuração
- endereço obtido no arquivo
- o compilador sempre aloca armazenamento (tipos const complexos não podem ser facilmente embutidos, então se torna um caso especial para tipos básicos)